2016-03-07 64 views
1

该代码对信号进行FFT并将其绘制在新的频率轴上。对绘制FFT幅度时的频率轴如何产生混淆

f=600; 
Fs=6000; 
t=0:1/Fs:0.3; 
n=0:1:length(t); 
x=cos(2*pi*(400/Fs)*n)+2*sin(2*pi*(1100/Fs)*n); 
y=fft(x,512); 

freqaxis=Fs*(linspace(-0.5,0.5, length(y))); 
subplot(211) 
plot(freqaxis,fftshift(abs(y))); 

我明白了为什么我们使用fftshift,因为我们希望看到在0赫兹(DC)价值为中心的信号,这是观察好。

enter image description here

但是我似乎是混淆频率轴是如何定义的。具体而言,为什么我们特别将[-0.5 0.5]的范围乘以Fs,并且我们获得[-3000 3000]范围?它可能是[-0.25 0.25]

回答

3

范围介于[-Fs/2,Fs/2]之间的原因是因为Fs/2Nyquist frequency。这是可能的最大频率,具有可视化的能力,并且频率分解中最终会出现的频率。我也不同意你的评论,其范围“可能在[-0.25,0.25]”之间。这与奈奎斯特频率的定义相反。

从信号处理理论,我们知道我们必须采样至少两倍的信号带宽,才能正确重构信号。带宽被定义为可以在您的信号中看到的最大可能频率分量,这也称为奈奎斯特频率的。换句话说:

Fs = 2*BW 

的,我们可以可视化的频谱和最终带宽/奈奎斯特频率的上限值设定为:

BW = Fs/2; 

因此,因为你的采样频率为6000赫兹,这个装置奈奎斯特频率是3000赫兹,所以可视范围是[-3000,3000]赫兹,这在你的幅度图中是正确的。


顺便说一句,你的bin中心的每个频率是不正确的。您将FFT中的二进制文件总数指定为512,但您指定的文件箱的方式是相对于信号的总长度。我很惊讶为什么你没有得到语法错误,因为fft函数的输出应该给你512点,但你的频率轴变量将是一个大于512的数组。在任何情况下,这是不正确的。在每个箱i频率应该是:

f = i * Fs/N, for i = 0, 1, 2, ..., N-1 

N是个总数你在你的FFT,这是512你原本作为length(y),这是不正确......所以这可能是您检查频率轴时出现混淆的原因。你可以通过参考用户Paul R的精彩帖子来了解为什么会出现这种情况:How do I obtain the frequencies of each value in an FFT?

请注意,我们只指定了从0到N-1的bin。考虑到这一点,当你指定每个频率的bin中心,你通常在linspace命令指定额外点和删除最后一个点:

freqaxis=Fs*(linspace(-0.5,0.5, 513); %// Change 
freqaxis(end) = []; %// Change 

顺便说一句,你声明freqaxis的方式是有点混淆了我。这对我来说是更具可读性:

freqaxis = linspace(-Fs/2, Fs/2, 513); 
freqaxis(end) = []; 

我个人讨厌使用length和我喜欢numel更多。


在任何情况下,当我运行更正后的代码,以指定的bin中心,我现在得到这个情节。需注意,我插入多个数据光标在频谱的峰值,其对应的频率为每一个已经声明余弦(400赫兹和1100赫兹)的:

enter image description here

你看到了有一些轻微的不准确,主要是由于您指定的箱数(即512)。如果你增加了箱子的总数,你会发现每个峰值的频率会更准确。