Разделение сигнала DTMF из файла wav с помощью Matlab

Вот контекст проблемы: у меня есть сигнал DTMF в формате wav, я должен определить последовательность чисел, которую он закодировал. Я должен сделать это, используя быстрое преобразование Фурье в Matlab, подразумевая, что я читаю wav-файл, используя wavread, и идентифицирую каждое число, разделенное паузой 40 мс или более.

Вот мой код:

[signal, fs] = wavread( 'C:\Temp\file.wav' );  % here, fs = 8000Hz

N = 512;                    
T = 1/fs;                   
L = length( signal )        
samples = fs / 1000 * 40    
windows = floor(L / samples) 
t = (1:L)/fs;

figure(1), plot(t, signal);

Вот как выглядит figure 1, это сигнал, считанный из wav: введите здесь описание изображения

Как я могу эффективно разделить сигнал на части, чтобы затем выполнить БПФ для каждой из 10 частей отдельно для декодирования соответствующих чисел?


person JF Beaulieu    schedule 24.01.2013    source источник
comment
Использование БПФ для этой задачи не совсем подходит — обычно обнаружение DTMF выполняется во временной области с использованием банка фильтров, либо с использованием обычных фильтров, либо с помощью алгоритма Герцеля.   -  person Paul R    schedule 24.01.2013
comment
Подходящее? FFT прекрасно справится с этой задачей, хотя это может быть и не самое эффективное решение.   -  person KlausCPH    schedule 25.01.2013
comment
Учитывая, что я делаю это в академических целях, использование БПФ обязательно.   -  person JF Beaulieu    schedule 26.01.2013
comment
@JFBeaulieu Эй, не возражаете, если я посмотрю ваш окончательный код? У меня точно такая же проблема, как у вас, и мне было интересно, не могли бы вы поделиться своим окончательным кодом.   -  person Bababarghi    schedule 21.10.2015


Ответы (2)


Я бы рекомендовал следующий подход:

  • Найдите огибающую сигнала во временной области (см. преобразование Гильберта).
  • Немного разгладьте конверт.
  • Возьмите разницу и найдите пики, чтобы получить начало тонов.
  • Используйте начала, чтобы выбрать кадры и найти спектр, используя БПФ.
  • Найдите индекс максимума в каждом из спектров и преобразуйте их в частоту.

Сложность в этом состоит в том, чтобы получить надежный детектор начала в точке 3. Пики в разнице, которую вы выбираете, должны быть определенного размера, чтобы их можно было квалифицировать как начало. Если ваши тона имеют разную силу, это может создать проблему, но, судя по вашему изображению сигнала времени, это не похоже на проблему.

С Уважением

person KlausCPH    schedule 24.01.2013

Это сработало для меня:

windowSize = 256;   
nbWindows = floor(L / windowSize);

for i=1:nbWindows
    coeffs = fft(signal((i-1)*windowSize+1:i*windowSize));    
    plot(abs(coeffs(1:N)));
    waitforbuttonpress
end;

Таким образом можно сдвигать окно до конца входного сигнала

person JF Beaulieu    schedule 31.01.2013