【问题标题】:FFT MATLAB code correct?FFT MATLAB 代码正确吗?
【发布时间】:2012-03-27 07:03:31
【问题描述】:

我想生成七个连接余弦函数的频谱。

我不确定我的代码是否正确;尤其是N = time*freq*7是否正确,或者是否应该是N = time*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。)

谢谢。

【问题讨论】:

  • 这段代码的结果就是这样。我不确定问题是什么;结果不符合你的预期吗?
  • 有点,我不确定我是否正确计算了级联 cos 函数的频谱,因为我不确定 N 是否应该等于 7*timefreq 或只是时间 i>频率。
  • 你为什么要连接这些不同的波形?当频率/相位发生变化时,每 1 秒就会出现一次可怕的不连续性。此外,如果您在整个 7 秒内进行 FFT,它也将毫无意义,因为 (a) 信号不是静止的 (b) 不连续性会产生大量伪影。我想知道您是否真正想做的是combine(即add)这7个不同的频率分量,这会更有意义吗?
  • 感谢您的回复。我完全同意你所说的。任务是将七个相加得到频谱,然后将七个连接起来得到频谱。然后比较频谱和“注意”它们是相同的;但是,如果我使用 N = freqtime*7,我不会得到相同的频谱,所以我想知道这是否正确。我应该补充一点,如果我将 N 更改为等于频率时间,我会得到相同的频谱;但是我不认为这是正确的。

标签: matlab fft


【解决方案1】:

让我纠正/帮助您解决一些问题:

1) 傅立叶变换的幅度通常以 dB 为单位显示。 20*log base10(FFT 系数) 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 变换是一堆大而窄的峰。 (否则相位调制将是选择的调制方案......零带宽)

【讨论】:

  • 我正在以均匀间隔的比例(不是分贝/对数)绘制双边光谱。我不明白为什么我不除以 N,你能详细说明一下吗?
  • @Adam:考虑到 OP 很难获得正确的 FFT 幅度,没有真正的优势,而且还有很多额外的并发症,然后做 20*log10 (虽然这是常见的,尤其是在感知声学中,它肯定不是报告 FFT 幅度的唯一有意义的方式)。
【解决方案2】:

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

Parseval's Theorem 的角度考虑这一点可能有助于弄清楚如何解释和规范化事物。

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

一些 cmets 讨论了不连续性,但应该注意的是,这些通常存在于 FFT 中,因为 FFT 波形被假定为周期性的,这通常意味着即使在边界处也存在有效的不连续性。非串联大小写。

【讨论】:

  • 感谢您的回答。我实际上已经绘制了它们和所有内容。我知道该怎么做。问题是,我没有得到与连接它们时相同的光谱。但问题是我应该这样做。我没有得到相同频谱的原因是因为连接它们的时间间隔发生了变化。我的问题是,讲师说光谱应该完全相同,但我认为它们不应该,我有点卡住了。我的问题是 n 是否应该等于您回答的 7xfreqxtime,这意味着讲座不正确,因为我相信她只除以 time*freq。
  • 我认为理解这一点的最佳方法是连接 7 个相同的波形,而不是连接 7 个不同的波形。那么很明显,FFT 应该完全相同(因为 FFT 假设波形是周期性的,所以从 FFT 的角度来看,波形确实是相同的)。这些是否相同,如果不是,那为什么不呢?
  • 另外,顺便说一句,值得考虑的是,“同样”,您的讲师可能意味着它们在恒定乘法因子内是相同的。根据上下文,情况可能确实如此。 (一般来说,正确获取 FFT 的幅度很重要,但非常非常普遍地认为它真的很重要,例如,即使在已发表的论文中,他们也不会在轴上放置单位,从而使实际值毫无意义),所以在一个恒定的比例因子内意味着一点也不奇怪。不过,无论如何,它似乎还是值得做对的。
  • 是的,我确实想过这个;我实际上问过她这个问题,她说他们(完全一样)并且向我展示了她的情节。我说我认为她的量级应该是串联的 0.5 的 1/7;然而,她只是不同意,说周期是一秒而不是七……这听起来很荒谬……
  • 你有没有尝试连接相同的波形,你明白为什么这两个结果应该是一样的吗?总是有一个问题是如何规范化事物,例如在能量密度或总能量方面,但如果规范化和解释正确,结果应该是相同的。在质疑这类事情时,我通常发现同时考虑 Parseval 定理会很有帮助,并考虑一下您为正常波形和 FFT 求和的项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-26
  • 2013-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多