Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Matlab中使用FFT实现傅里叶级数系数非负_Matlab_Fft - Fatal编程技术网

在Matlab中使用FFT实现傅里叶级数系数非负

在Matlab中使用FFT实现傅里叶级数系数非负,matlab,fft,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... 我在这里做错了什么?鉴于您如何定

我试图在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
绘图相比):

幸运的是,您可以通过使用撤消此转换。然后还应注意,为了获得余弦系数正好为零(或至少在可用的数值精度范围内)的反对称函数(与原始连续时间函数一样),需要使用奇数个样本。这将为您提供以下代码:

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
系数(现在符合您的预期和上面引用的分析结果):


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