我在信号()中有一个电话号码,我知道采样频率是8000hz。使用命令频谱图,如何确定电话号码?
答案 0 :(得分:1)
您是否生成了测试信号以验证代码? 看看下面的Matlab代码。
% sampling frequency
fs = 8000;
% sample instants (100 ms)
t = 0 : 1/fs : 100e-3 - 1/fs;
% test frequencies
f1 = 941; %697;
f2 = 1209; %1633;
% generate test signal
tone1 = sin(2*pi*f1*t);
tone2 = sin(2*pi*f2*t);
sig = tone1 + tone2;
%window = ones(100, 1); % rectangular window
%window = hamming(100); % Hamming window
noverlap = 0;
nfft = 1024;
spectrogram(sig, window, noverlap, nfft, fs);
s = spectrogram(sig, window, noverlap, nfft, fs);
figure;
plot( abs( s ) )
并查看图2中生成的图。 您可以使用不同的测试音频率和窗口(例如矩形,汉明,汉宁,布莱克曼等)。您将看到光谱中色调峰值的锐度(关于光谱拖尾和泄漏)。
数字nfft
确定在FFT中计算的系数数。这与图中的频率分辨率有关。
计算整个频谱图可能有点过分。正如您在绘制的频谱中看到的那样,再次生成测试音:DTMF由两个音调组成。因此,如果我是对的,频谱图的最大值也只会返回一个频率。
此外,计算整个频谱图可能是一种过度杀伤,因为它在计算上相当复杂。您可以计算给定DTMF频率的DFT分量(= 4行+4列= 8个频率进行评估)。