如何在时域信号上检测来自FFT的幅度

时间:2014-11-05 18:41:39

标签: matlab fft frequency amplitude magnitude

我有一首波浪的信号,我的振幅有问题。

%graph 1 time domain
song2 = song(1:size(song));
fs = 44100;
dt = 1/fs;
t = 0:dt:(length(song2)*dt)-dt;
figure(); 
plot(t,abs(song2)); xlabel('Seconds'); ylabel('Amplitude');

然后我把信号放在FFT中,因为我想获得检测峰值的幅度(例如:164Hz)。

%graph 2 fft
L = length(song2); 
NFFT = 2^nextpow2(L);
f = fs/2*linspace(0,1,NFFT/2+1);
X = fft(song2,NFFT)/L; 
X = 2*abs(X(1:NFFT/2+1)); 
figure(); 
plot(f,X);  

当我得到信号的幅度时出现问题(例如; 0.0103)但是如果我与(时域)的幅度相比则不一样。

我的问题是如何在时域(图1)中检测频率的幅度(例如,幅度为0.0103的164)?

编辑:

嗯,我宁愿这样问。我将频域频谱中的频率检测为图link 例如,让我们取第一个信号(82hz)(幅度:0.0075)我的问题是否可以检测时域中第一个信号的位置,如link中的图形

任何帮助都会有所帮助。

2 个答案:

答案 0 :(得分:0)

您是否尝试过使用正弦输入的代码?

制作长度为512(任何合理长度)的正弦波,振幅为1,频率等于164 Hz。

当你运行程序时,我确信你会看到频率仓的增益对应于164 Hz接近1,只要你的频率分辨率不是太差(意味着你还没有用过)几个FFT点。)

如果上述方法有效,那么您的代码也适用于歌曲。在音乐这样的多音时域信号的情况下,如何判断/验证时域幅度是我不知道的。

答案 1 :(得分:0)

如果我正确地理解了你的问题,你可以通过在感兴趣的频率上用复杂的正弦波来获取时域信号的内积来找到你想要的东西。例如,使用您帖子中的信息,我们会像以下内容:

% graph 1 time domain
song2 = song(1:size(song));
fs = 44100;
dt = 1/fs;
t = 0:dt:(length(song2)*dt)-dt;
x_164 = exp(-1j * 2*pi * 164 * t);
f_164 = x_164(:).' * song2(:);       % Spectral content of the signal at 164(Hz).

如果您考虑DFT是什么,您只会看到它只是上述过程,但选择的频率使得它们是正交的。但是,您可以使用相同的过程来估算您想要的任何频率的频谱内容。