使用Matlab从wav文件中分离DTMF信号
这里是问题的背景:我有一个wav格式的DTMF信号,我必须识别它编码的数字序列。我必须在Matlab中使用快速傅立叶变换,这意味着我使用wavread读取wav文件,并识别每个以40ms或更大间隔分隔的数字 以下是我目前的代码:使用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
[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嘿,你介意我看一下你的最终代码吗?我确实有与您完全相同的问题,我想知道您是否愿意分享您的最终代码。