波干扰:添加两个相反相位的波 + 使用 FFT - MATLAB 问题
Posted
技术标签:
【中文标题】波干扰:添加两个相反相位的波 + 使用 FFT - MATLAB 问题【英文标题】:Wave interference: adding two waves with opposite phases + using FFT - MATLAB problems 【发布时间】:2017-07-28 09:00:43 【问题描述】:我有两个主要问题,但从头开始: 我想知道 FFT(快速傅里叶变换)如何在实际示例中起作用。我创建了两个正弦波(例如 Wave1 = 5 Hz 和 Wave2 = 15 Hz 幅度),然后我将这两个相加并从第三个“Wave3”进行 FFT。看起来不错 - 我在 5 赫兹和 15 赫兹附近看到了我的“峰值”。
蓝色 = 5 Hz,红色 = 15 Hz,黄色 = 蓝色 + 红色。 “黄色”波的 FFT,看起来不错:
好的,然后我已经更改了数据。现在我有两个振幅相同但相位相反的波。如果我添加它们,它们的幅度为 0 - 这对我来说似乎是正确的。
两个相位相反的波。 Yellow - 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第 3 波(总和):
-5,68989300120393e-16 -1,11022302462516e-16 -1,11022302462516e-16 3,05311331771918e-16 -1,11022302462516e-16为什么这些波的总和不等于0,如图所示?为什么 FFT 看起来如此奇怪? FFT 是否有可能向我们展示两个具有相反相位的相同波的实际幅度?我以为不会,但事实是什么?
这是我的 MATLAB 代码:
三波:
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');
FFT 代码:
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');
非常感谢您提前...
玛丽
【问题讨论】:
在第二张图中查看频率幅度的比例。它们实际上为零(大约为eps
)。结果似乎是正确的,最多floating-point inaccuracies
嗨!感谢你的回复!好的,据我所知,数据很好(即我的代码中没有错误),并且由于我的规模,我无法真正看到“黄色”线并不像看起来那样平坦。没关系,谢谢。我还不明白,为什么用“-0,125..”添加“0,125..”不是“0”而是“-1,11”之类的东西。为什么 FFT 看起来如此奇怪,好像这个黄色波是由 0 到 500 Hz 的所有这些频率组成的?物理学中有一些我不明白的东西。我以为会有破坏性干扰。不是吗?
您在第二张图中看到的 FFT 幅度大约是第一张图中的 10^16
倍。它们应该是0
,但它们不完全是0
,因为存在小的数值错误。举个更简单的例子,试试sin(pi/4)-sqrt(2)/2
,你会发现它给出的不是0
。所以这对物理学来说并不奇怪。这只是数字问题。如果将两个 FFT 绘制在相同的轴上,与第一个相比,第二个实际上看起来为零
哦!现在我明白了,所以这都是关于那些小数字和比例尺上的数字错误。非常感谢您的回答!
是的,你的回答很好。您可以关闭此主题,尽管我认为它与您提到的主题不太一样。不仅要了解 Matlab 的工作原理,还要了解 FFT 和波形:更多像我这样的菜鸟可能会觉得你的答案很有趣。再次感谢您:)。
【参考方案1】:
首先,你的计算是正确的。
因为这两个图是自动调整大小的,所以解释它们很容易出错,但是第二个的幅度比第一个小得多(分别为10e-16 vs. 10e1
)。
在第二张图上,让您感到困惑的是,您只是数字错误的受害者:这些数字可以解释为0
。
从那里,您有两个简单的解决方案:
-
您对自己的结果很好,您可以调整数字以以相同比例显示结果以避免任何误导性解释
您希望使用“正确的零值”而不是“小值”
1) 为 Y 轴设置限制
您可以在绘制图形时添加类似这条线的内容(这只是一个示例 - 更改它以满足您的需要):
ymax = max(abs(my_fft));
ymin = - ymax;
ylim([ymin ymax])
2) 设置过滤数字错误的限制
与许多数值方法算法一样,您可能希望将0
值视为介于0
和小区间(通常称为epsilon
)之间的值:
abs_fft = abs(my_fft);
epsilon = 10e-12 % your threshold
abs_fft(abs_fft < epsilon) = 0;
您可能想查看eps
,这是一个内置的 Matlab 变量,适用于这种情况。
【讨论】:
非常感谢! Luis 已经向我解释过了,但感谢您对 MATLAB 代码的长篇回答。我已经使用它们来设置过滤这些数字错误的限制 - 它工作得很好! :) 乐于助人! :)以上是关于波干扰:添加两个相反相位的波 + 使用 FFT - MATLAB 问题的主要内容,如果未能解决你的问题,请参考以下文章