0

我有一个波歌信号,但幅度有问题。

%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)?

编辑:

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

任何帮助都会有所帮助。

4

2 回答 2

0

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

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

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

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

于 2014-11-05T20:09:22.153 回答
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 是什么,您会发现它只是上述过程,但所选择的频率使得它们来自正交基。但是,您可以使用相同的过程来估计您想要的任何频率的频谱内容。

于 2014-11-05T22:51:52.977 回答