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

Posted

技术标签:

【中文标题】Matlab中的傅里叶级数系数​​使用FFT不是负数【英文标题】:Fourier series coefficients in Matlab not negative using FFT 【发布时间】:2016-01-25 20:57:45 【问题描述】:

我正在尝试在 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】:

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

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

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

幸运的是,您可以使用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 系数(现在符合您的期望和上面引用的分析结果):

【讨论】:

像魅力一样工作。幸运的是,这个问题有一个相当简单的解决方案,所以我可以在其他编程语言中使用它。感谢您的详尽回答。

以上是关于Matlab中的傅里叶级数系数​​使用FFT不是负数的主要内容,如果未能解决你的问题,请参考以下文章

matlab 编写计算傅里叶级数函数

matlab 求矩形脉冲的傅里叶级数

具有负 fft 值的傅里叶变换和滤波频率

MATLAB傅里叶变换后寻找频谱次大值对应的位置

matlab 求全波整流信号的傅里叶级数

matlab 模拟吉布斯效应