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

时间:2013-01-24 03:54:13

标签: 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 = length( signal )        
samples = fs / 1000 * 40    
windows = floor(L / samples) 
t = (1:L)/fs;

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

以下是figure 1的样子,即从wav读取的信号: enter image description here

如何有效地将信号分割成碎片,以便我可以分别对10个碎片中的每个碎片进行FFT解码以解码相应的数字?

2 个答案:

答案 0 :(得分:0)

我建议采用以下方法:

  • 在时域中找到信号的包络(参见希尔伯特变换)。
  • 稍微平滑信封。
  • 取差异并找到峰值以获得色调的开始。
  • 使用onsets选择帧并使用fft查找光谱。
  • 找出每个频谱中的最大值索引并将其转换为频率。

这个棘手的部分是在第3点获得一个强大的起始探测器。你选择的差异中的峰值必须具有一定的大小才能符合开始时的要求。如果您的音调强度不同,这可能会造成问题,但从时间信号的图像来看,这似乎不是问题。

此致

答案 1 :(得分:0)

这对我有用:

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;

这样可以将窗口移动到输入信号的末尾