我正在尝试编写IFT算法。这是我的代码:
%% Fourier Analysis
N = 20;
T1 = 0.25*N;
T0 = N;
x = [zeros(T1,1); ones(T0/2,1); zeros(T1,1)]';
omega = 2*pi*1/T0;
ak = zeros(1,2*N+1);
for k = -N:N
if k == 0
ak(k+N+1) = 2*T1/T0;
else
ak(k+N+1) = sin(k*omega*T1)/(k*pi);
end
end
%Approximate the periodic symmetric square wave
t=linspace(-0.5,0.5,N);
for n=1:length(t)
xN(n)=0;
for k = -N:N
xN(n) = xN(n) + ak(k+N+1).*exp(1i*k*omega*t(n));
end
end
它有什么问题(我知道Matlab有ifft()函数,但我想写自己的)?我用它来代码:
结果看起来像(EN是错误的):
其中黑色图是xN而蓝色图是x。我的结果是直线。
答案 0 :(得分:3)
我不知道你在图像中得到那个公式的位置,但是对于离散信号的N
- 点傅立叶变换,你只需要从k
加总{ {1}} {}为0
进行精确重建。 N-1
正交基函数可以重建任何N
维信号。您可能会将DTFT与DFT混淆(您希望其中的第二个)。
我也不了解您用于N
系数的公式。你用ak
计算它们,然后用复数指数而不是正弦波来计算它们。
如果要使用复数指数进行离散傅里叶变换(DFT),代码应该与下面的代码类似。您从时间信号sin
的内积和复数基函数中得到ck
系数。
x
如果你想使用真正的正弦曲线做一个普通的傅立叶级数,你的代码应该是这样的:
clear; clc;
N = 20; %// number of points
x = [zeros(1,N/4),ones(1,N/2),zeros(1,N/4)]; %//time signal data
n = 0:N-1;
ck = zeros(1,N);
for k = 0:N-1 %//cacluate coefficients
ck(k+1) = sum(x.*exp(-1i*2*pi*k*n/N));
end
xN = zeros(1,N);
for k = 0:N-1 %// add partial frequencies
xN = xN + ck(k+1)*exp(1i*2*pi*k*n/N)/N;
end
plot(n,xN)