使用Matlab从wav文件中分离DTMF信号

使用Matlab从wav文件中分离DTMF信号,matlab,signal-processing,fft,octave,dtmf,Matlab,Signal Processing,Fft,Octave,Dtmf,这里是问题的背景:我有一个wav格式的DTMF信号,我必须识别它编码的数字序列。我必须在Matlab中使用快速傅立叶变换,这意味着我使用wavread读取wav文件,并识别每个以40ms或更大间隔分隔的数字 以下是我目前的代码: [signal, fs] = wavread( 'C:\Temp\file.wav' ); % here, fs = 8000Hz N = 512; T = 1/fs; L = lengt

这里是问题的背景:我有一个wav格式的DTMF信号,我必须识别它编码的数字序列。我必须在Matlab中使用快速傅立叶变换,这意味着我使用wavread读取wav文件,并识别每个以40ms或更大间隔分隔的数字

以下是我目前的代码:

[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);
图1所示为从wav读取的信号:


如何有效地将信号分割成若干段,以便分别对10段中的每一段进行FFT,以解码相应的数字?

我建议采用以下方法:

在时域中找到信号的包络,参见希尔伯特变换。 把信封弄光滑一点。 使用diff并找到峰值,以获得音调的起始点。 使用onset拾取帧并使用fft查找频谱。 找到每个频谱中最大值的索引,并将其转换为一个频率。 其中的棘手部分是在第3点获得一个健壮的开始检测器。您选择的差异中的峰值必须具有一定的大小,才能符合开始时的条件。如果你的音调强度不同,这可能会造成问题,但从你的时间信号图像来看,这似乎不是问题

关于

这对我很有用:

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;

通过这种方式,可以移动窗口,直到输入信号结束为止。对于此任务,使用FFT实际上并不合适-通常使用滤波器组在时域中执行DTMF检测,使用传统滤波器或Goertzel算法。合适吗?fft可以很好地完成这项工作,尽管它可能不是最有效的解决方案。考虑到我这样做是出于学术目的,必须使用fft。@JFBeaulieu嘿,你介意我看一下你的最终代码吗?我确实有与您完全相同的问题,我想知道您是否愿意分享您的最终代码。