FFT MATLAB代码是否正确?

时间:2012-03-27 07:03:31

标签: matlab fft

我想生成七个级联余弦函数的频谱。

我不确定我的代码是否正确;特别是,N =时间* freq * 7是否正确,或者它是否应该是N =时间* freq(没有时间七)。

我的代码如下:

sn = [1, 2, 3, 4, 5, 6, 7, 8];
time = 1;
freq = 22050;
N = time*freq*7;
dt = 1/freq;

t = 0 : dt : time - dt;

y = @(sn, phasePosNeg) cos(2*pi*(1200-100*sn) * t + phasePosNeg * sn*pi/10);

f = [y(sn(1), 1), y(sn(2), -1), y(sn(3), 1), y(sn(4), -1), y(sn(5), 1), y(sn(6), -1), y(sn(7), 1)];
F = abs(fftshift(fft(f)))/N;

df = freq/N;
faxis = -freq/2 : df : (freq/2-1/freq);

plot(faxis, F);
grid on;
axis([-1500, 1500, 0, 0.6]);
title('Frequency Spectrum Of Concatenated Cosine Functions');
xlabel('Frequency (Hz)');
ylabel('Magnitude');

我想我的问题的本质是: 尖峰的高度应该等于0.5的1/7,还是0.5? (所有余弦函数的幅度均为1.)

谢谢。

2 个答案:

答案 0 :(得分:0)

这显然是功课,所以我只想给出一些方向:
在连续的情况下,把它想象成你添加六个波形,每个波形用零填充(长度的6倍) (波形),然后将它们偏移,使它们不重叠,然后加在一起形成级联波形。如果您要添加各个波形的FFT,还要记住您假设它们是周期性的。所以你基本上需要处理零填充,这样你就可以比较苹果和苹果。当然,一个检查只是在整个过程中使用一个波形,并确保它在这种情况下工作(这应该返回完全相同的结果,因为FFT假定波形是周期性的 - 也就是说,无限连接到自身)。 / p>

根据Parseval's Theorem来考虑这一点可能有助于弄清楚如何解释和规范事物。

使用N=(7*time)*freq是正确的,因为无论您如何构造波形,波形的实际时间都是7*time

有几条评论谈到了不连续性,但应该注意的是,这些通常存在于FFT中,因为假设FFT波形是周期性的,这通常意味着即使在边界处也存在有效的不连续性。非连锁案例。

答案 1 :(得分:0)

让我纠正/帮助你做一些事情:

1)傅里叶变换通常以dB为单位显示。 20 * log base10(FFT coeff) 2)无需将FFT幅度除以任何N值。

F = abs(fftshift(fft(f)))/N; %get rid of the N or N =1

3)如果N是FFT中的点数N = size(t);因为你已经采用了许多sin / cos函数的样本

4)绘制函数时,请记住FFT从-Pi跨越到+ Pi,您需要使用采样频率将其重新映射到频谱

5)由于这些函数之间存在较大的相位不连续性,因此不要指望forrier转换为一堆大的窄峰。 (否则,相位调制将是选择的调制方案......零带宽)