Matlab中的傅里叶级数系数​​使用FFT不是负的

时间:2016-01-25 20:57:45

标签: matlab fft

我试图在Matlab中使用FFT获得傅立叶级数系数​​。它们具有正确的绝对值,但我也需要这些术语的标志。

t = linspace(-pi,pi,512);
L = length(t);

S = t; % Function

c = fft(S)/L
a = c(2:end)+c(end:-1:2)
b = (c(2:end)-c(end:-1:2))*i

%The first/last b-terms should be 2, -1, 0.66, -0.50... 

我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

鉴于您如何定义tS,您似乎正在尝试获取周期性连续时间函数的傅立叶级数系数​​:

\begin{align}f\left(t\right) &= t & \mbox{for } t \in (-\pi,\pi)\end{align}

plot(t,S)

可以通过分析评估(或在傅立叶变换表中查找):

\begin{align}2\sum_{n=1}^\infty \frac{\left(-1\right)^{n+1}}{n} \sin\left(n x\right)\end{align}

问题在于,当您调用fft时,您没有传递时间变量,因为它隐含地将时间与#34; 0"第一个数据样本。如果我们绘制fft看到的函数的结果周期性扩展,您应该注意到时间偏移(与上面的St图相比):

enter image description here

幸运的是,您可以使用ifftshift撤消此转变。您还应该注意,为了使反余弦函数(与原始连续时间函数一样),余弦系数正好为零(或者至少在可用的数值精度范围内),您需要使用奇数样本数量。这应该给你以下代码:

N = 512;
t = linspace(-pi,pi,N-1); % use odd number of samples to get anti-symmetric signal
L = length(t);
S = ifftshift(t);         % ifftshift swaps lower & upper half of t, yielding S(1)=0

c = fft(S)/L;
a = c(2:end)+c(end:-1:2);
b = (c(2:end)-c(end:-1:2))*1i;

以及相应的前10个b系数(现在符合您的预期和上面引用的分析结果):

Plot of irst 10 <code>b</code> coefficients