Matlab中的傅里叶级数系数不是负的使用FFT
Fourier series coefficients in Matlab not negative using 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...
我做错了什么?
根据您定义 t
和 S
的方式,您似乎正在尝试获取周期性连续时间函数的傅里叶级数系数:
可以分析评估(或在傅里叶变换表中查找)为:
问题是您在调用 fft
时没有传递时间变量,因为它隐式地将时间“0”与第一个数据样本相关联。如果我们绘制由 fft
看到的函数的结果周期性扩展,您应该注意到时移(与上面的 S
对比 t
图相比):
幸运的是,您可以使用 ifftshift
撤消此转换。然后您还应该注意,为了获得余弦系数恰好为零(或至少在可用数值精度范围内)的 anti-symmetric 函数(与原始连续时间函数一样),您需要使用奇数个样本。这应该为您提供以下代码:
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 获取傅里叶级数系数。它们具有正确的绝对值,但我还需要这些项的符号。
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...
我做错了什么?
根据您定义 t
和 S
的方式,您似乎正在尝试获取周期性连续时间函数的傅里叶级数系数:
可以分析评估(或在傅里叶变换表中查找)为:
问题是您在调用 fft
时没有传递时间变量,因为它隐式地将时间“0”与第一个数据样本相关联。如果我们绘制由 fft
看到的函数的结果周期性扩展,您应该注意到时移(与上面的 S
对比 t
图相比):
幸运的是,您可以使用 ifftshift
撤消此转换。然后您还应该注意,为了获得余弦系数恰好为零(或至少在可用数值精度范围内)的 anti-symmetric 函数(与原始连续时间函数一样),您需要使用奇数个样本。这应该为您提供以下代码:
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
系数(现在符合您的预期和上面引用的分析结果):