首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >波干扰:用FFT - MATLAB问题加两个相位相反的波+

波干扰:用FFT - MATLAB问题加两个相位相反的波+
EN

Stack Overflow用户
提问于 2017-07-28 09:00:43
回答 1查看 877关注 0票数 1

我有两个主要的问题,但从一开始:我想知道FFT (快速傅里叶变换)如何在实际例子中工作。我创建了两个正弦波(例如,Wave1 =5Hz和Wave2 = 15 Hz振幅),然后添加这两个,然后从第三个"Wave3“中进行快速傅立叶变换。它看起来不错-我看到了我的“高峰”在5和15赫兹左右。

蓝色=5赫兹,红色= 15赫兹,黄色=蓝色+红色。“黄”波的FFT,看上去不错:

好的,然后我改变了数据。现在我有两个振幅相同但相位相反的波。如果我把它们加起来,它们的振幅是0,这对我来说是正确的。

两个相位相反的波。黄色- Wave1+Wave2 +黄波的奇异FFT:

现在是我完全不明白的部分。以下是我的问题:

( 1)即使我在图片上看到第三个黄波的振幅等于0,也不像数据表中的那样。在添加两个主波之后(它们有相反的数据!)我得到了奇怪的结果。

示例:数据中的5点

第一波:

  • 0,0627905195293128
  • 0,125333233564304
  • 0,187381314585724
  • 0,248689887164855
  • 0,309016994374947

第二波:

  • -0,0627905195293134
  • -0,125333233564304
  • -0,187381314585724
  • -0,248689887164855
  • -0,309016994374947

第三波(和):

  • -5 68989300120393e-16
  • -1,11022302462516 e-16
  • -1,11022302462516 e-16
  • 3 05311331771918 e-16
  • -1,11022302462516 e-16

为什么这些波的和不等于0,如图中所示?为什么FFT看起来这么奇怪?FFT是否有可能向我们展示两个相位相反的相同波的真实振幅?我以为不会,但事实是什么?

这里是我的MATLAB代码:

三波:

代码语言:javascript
复制
D = 1; % 1 second
S = 1000; % sampling rate
P = 0.5; % phase
T = 1/S; % sampling period
t = [T:T:D]; % time
myphi=2*pi*P;
myphi2=2*pi*1;

syn3 = sin(2*10*t*pi+myphi); % first wave
syn2 = sin(2*10*t*pi+myphi2); % second wave
sinmax=syn2+syn3; % yellow wave

figure; plot(t,syn3,t,syn2,t,sinmax,'LineWidth',2); grid on;
xlabel('Time (seconds)');
ylabel('Amplitude');

快速傅立叶变换码:

代码语言:javascript
复制
L = length(sinmax);
myFFT = fft(sinmax,S);
myFFT=myFFT/L; %scale the output to 1
freq = S/2*linspace(0,1,S/2);
figure; stem(freq,abs(myFFT(1:length(freq))));
xlabel('Frequency (Hz)');
ylabel('Amplitude');

谢谢你提前..。

玛丽

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-28 10:21:35

首先,的计算是正确的。

由于这两个图是自动调整大小的,很容易出错解释它们,但振幅在第二个比第一个(10e-16 vs. 10e1,分别)小得多。

在第二张图上,让你困惑的是,,你只是数字错误的受害者,:这些数字可以解释为0

在这里,您有两个简单的解决方案:

  1. 你对你的结果没有意见,你只需调整数字以显示相同比例的结果,以避免任何误导性的解释。
  2. 您希望有“适当的零值”而不是“小值”。

1) 为Y轴设置了一个极限。

在绘制数字时,您可以添加类似于这一行的内容(这只是一个示例--修改它以满足您的需要):

代码语言:javascript
复制
ymax = max(abs(my_fft));
ymin = - ymax;
ylim([ymin ymax])

2) 对数值误差的滤波设置了一个限制,

与许多数值方法算法一样,您可能希望将0值考虑为介于0和小间隔之间的值,通常称为epsilon

代码语言:javascript
复制
 abs_fft = abs(my_fft);
 epsilon = 10e-12 % your threshold
 abs_fft(abs_fft < epsilon) = 0;

您可能需要查看eps,这是一个内置的Matlab变量,用于这种情况。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45369193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档