1

这是问题的背景:我有一个 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 读取的信号的样子: 在此处输入图像描述

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

4

2 回答 2

0

我会推荐以下方法:

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

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

问候

于 2013-01-24T06:59:41.917 回答
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;

这样可以移动窗口直到输入信号结束

于 2013-01-31T19:51:37.490 回答