傅里叶变换信号的合成
Synthesis of signal from Fourier transformation
我在 Matlab 工作。我有图形功能。我应该:
- 在纸上展开为傅立叶级数,
- 从我的系列中重构这个函数,
- 根据答案系列重建函数(我有傅立叶级数的求解),
- 将我重建的函数与原始函数进行比较。
step = 0.05;
t = -5:step:10;
y1 = heaviside(abs(t)-6);
y2 = heaviside(-(abs(t)-2));
funct = 4*(y1+y2)+2;
plot(t,funct,'LineWidth',2),grid;
%coefficients of my Fourier series y
a = -4; b = 8; T = abs(a-b); L = T/2;
a0 = 8;
a(1) = 2*sqrt(3)/pi; b(1) = -2/pi;
a(2) = 6*sqrt(3)/pi; b(2) = 3/pi;
a(3) = 0; b(3) = - 8/(3*pi);
a(4) = -2*sqrt(3)/pi; b(4) = 3/(2*pi);
a(5) = -2*sqrt(3)/(5*pi); b(5) = -2/(5*pi);
n = -5:step:10;
sum = 0;
for k = 1:5
sum = sum + a(k)*cos(n*pi*k/L)+b(k)*sin(n*pi*k/L);
end
y = a0/2 + sum; %my series
%answer Fourier series y2
n = -5:step:10;
sum = 0;
for k = 1:5
sum = sum + (power(-1,k-1)/(2*k-1))*cos((2*k-1)*pi*n/4);
end
y2 = 4+(8/pi)*sum; %answer series
n = 1:length(t);
hold on
plot(n*step-5,y,'r-');
当我绘制 y(我的重构函数)时,我得到了下图:
但是当我绘制 y2(答案函数)时,我得到了很好的结果:
第一张图看起来我在重建信号时只使用了一个傅里叶分量。
为什么我的解决方案得到了如此糟糕的结果?
更新:
我无法摆脱第一种方法错误的感觉,所以我在进一步思考。你的程序和图片完全正确!
不同之处在于,在第二个循环中,k=1
导致周期长度为 8,相位为 0(即余弦从 x=0
开始),这与基础矩形函数非常匹配。
但在第一个循环中,k=1
的周期长度稍长(并且相位不同于 0)。较长的周期长度加上每个余弦和正弦分量(不仅是第二个循环中的奇数分量)
导致近似值不是很明显地适合底层矩形函数(但实际上它在这个低数量的系数下做得尽可能好)。您需要使用大约 15 个而不是 5 个系数来获得与第二个循环类似的良好拟合。
旧的错误调试方法:
我的第一个猜测是你的系数 a
和 b
的值是错误的,因为正确的函数是偶数,因此所有正弦振幅都应该为零(为什么! ).
为了测试你的第一个估计循环是否正确,我从第二个循环中获取了系数
k = 1:5;
a = power(-1,k-1) ./ (2*k-1);
b = zeros(1,5);
并在第一个循环而不是你的循环中使用它们。结果还是错了。
因此,要找到第二个错误,您需要比较行
sum = sum + a(k)*cos(n*pi*k/L)+b(k)*sin(n*pi*k/L);
和
sum = sum + a(k)*cos((2*k-1)*pi*n/4);
如果您想自己调试,请停止阅读,否则我的下一个提示是 (2*k-1)
保证只有第 1、第 3、第 5 ... 余弦获得不为零的振幅值(这是矩形波的必要属性)。
@Hartmut Pfitzinger,感谢您的回答。我找到了另一种方法来解决我的问题:我考虑了 (-4, 8) 区间上的函数,它既不是奇数也不是偶数。但我意识到我可以考虑 (-2, 6) 区间上的函数,它会是偶数。所以我只是将信号扩展到区间 (-2,6) 上的傅里叶级数,仅找到 cos 的系数,并在第二个循环中获得近似值。
我在 Matlab 工作。我有图形功能。我应该:
- 在纸上展开为傅立叶级数,
- 从我的系列中重构这个函数,
- 根据答案系列重建函数(我有傅立叶级数的求解),
- 将我重建的函数与原始函数进行比较。
step = 0.05;
t = -5:step:10;
y1 = heaviside(abs(t)-6);
y2 = heaviside(-(abs(t)-2));
funct = 4*(y1+y2)+2;
plot(t,funct,'LineWidth',2),grid;
%coefficients of my Fourier series y
a = -4; b = 8; T = abs(a-b); L = T/2;
a0 = 8;
a(1) = 2*sqrt(3)/pi; b(1) = -2/pi;
a(2) = 6*sqrt(3)/pi; b(2) = 3/pi;
a(3) = 0; b(3) = - 8/(3*pi);
a(4) = -2*sqrt(3)/pi; b(4) = 3/(2*pi);
a(5) = -2*sqrt(3)/(5*pi); b(5) = -2/(5*pi);
n = -5:step:10;
sum = 0;
for k = 1:5
sum = sum + a(k)*cos(n*pi*k/L)+b(k)*sin(n*pi*k/L);
end
y = a0/2 + sum; %my series
%answer Fourier series y2
n = -5:step:10;
sum = 0;
for k = 1:5
sum = sum + (power(-1,k-1)/(2*k-1))*cos((2*k-1)*pi*n/4);
end
y2 = 4+(8/pi)*sum; %answer series
n = 1:length(t);
hold on
plot(n*step-5,y,'r-');
当我绘制 y(我的重构函数)时,我得到了下图:
但是当我绘制 y2(答案函数)时,我得到了很好的结果:
第一张图看起来我在重建信号时只使用了一个傅里叶分量。
为什么我的解决方案得到了如此糟糕的结果?
更新:
我无法摆脱第一种方法错误的感觉,所以我在进一步思考。你的程序和图片完全正确!
不同之处在于,在第二个循环中,k=1
导致周期长度为 8,相位为 0(即余弦从 x=0
开始),这与基础矩形函数非常匹配。
但在第一个循环中,k=1
的周期长度稍长(并且相位不同于 0)。较长的周期长度加上每个余弦和正弦分量(不仅是第二个循环中的奇数分量)
导致近似值不是很明显地适合底层矩形函数(但实际上它在这个低数量的系数下做得尽可能好)。您需要使用大约 15 个而不是 5 个系数来获得与第二个循环类似的良好拟合。
旧的错误调试方法:
我的第一个猜测是你的系数 a
和 b
的值是错误的,因为正确的函数是偶数,因此所有正弦振幅都应该为零(为什么! ).
为了测试你的第一个估计循环是否正确,我从第二个循环中获取了系数
k = 1:5;
a = power(-1,k-1) ./ (2*k-1);
b = zeros(1,5);
并在第一个循环而不是你的循环中使用它们。结果还是错了。 因此,要找到第二个错误,您需要比较行
sum = sum + a(k)*cos(n*pi*k/L)+b(k)*sin(n*pi*k/L);
和
sum = sum + a(k)*cos((2*k-1)*pi*n/4);
如果您想自己调试,请停止阅读,否则我的下一个提示是 (2*k-1)
保证只有第 1、第 3、第 5 ... 余弦获得不为零的振幅值(这是矩形波的必要属性)。
@Hartmut Pfitzinger,感谢您的回答。我找到了另一种方法来解决我的问题:我考虑了 (-4, 8) 区间上的函数,它既不是奇数也不是偶数。但我意识到我可以考虑 (-2, 6) 区间上的函数,它会是偶数。所以我只是将信号扩展到区间 (-2,6) 上的傅里叶级数,仅找到 cos 的系数,并在第二个循环中获得近似值。