波干涉:相加两个相位相反的波+使用FFT - MATLAB问题
Wave interference: adding two waves with opposite phases + using FFT - MATLAB problems
我有两个主要问题,但从头开始:
我想知道 FFT(快速傅立叶变换)如何处理真实示例。我创建了两个正弦波(例如 Wave1 = 5 Hz 和 Wave2 = 15 Hz 振幅),然后我将这两个相加并从第三个 "Wave3" 进行 FFT。看起来不错 - 我看到我的 "peaks" 在 5 赫兹和 15 赫兹左右。
蓝色 = 5 赫兹,红色 = 15 赫兹,黄色 = 蓝色 + 红色。来自 "Yellow" Wave 的 FFT,看起来不错:
好的,那我改数据了。现在我有两个振幅相同但相位相反的波。如果我添加它们,它们的振幅为 0 - 这对我来说似乎是正确的。
两个相位相反的波。黄色 - Wave1+Wave2 + 黄色波的奇怪 FFT:
现在是我完全不明白的部分。这是我的问题:
1) 即使我在图片上看到这第三个黄色波的振幅等于0,数据表中也不是这样。添加两个主波后(并且它们具有相反的数据!)我得到了奇怪的结果。
示例:数据中的前 5 个点
第 1 波:
- 0,0627905195293128
- 0,125333233564304
- 0,187381314585724
- 0,248689887164855
- 0,309016994374947
第 2 波:
- -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');
非常感谢您...
玛丽
首先,你的计算是正确的。
因为两个图是自动调整大小的,所以很容易在解释它们时出错,但是第二个的振幅比第一个小得多(分别为10e-16 vs. 10e1
)。
在第二张图上,让您感到困惑的是,您只是数字错误的受害者:这些数字可以解释为0
。
从那里,你有两个简单的解决方案:
- 你对你得到的结果很满意,你可以调整数字以相同比例显示结果以避免任何误导性解释
- 你想要 "proper zero values" 而不是 "small ones"
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 变量,适用于此类情况。
我有两个主要问题,但从头开始: 我想知道 FFT(快速傅立叶变换)如何处理真实示例。我创建了两个正弦波(例如 Wave1 = 5 Hz 和 Wave2 = 15 Hz 振幅),然后我将这两个相加并从第三个 "Wave3" 进行 FFT。看起来不错 - 我看到我的 "peaks" 在 5 赫兹和 15 赫兹左右。
蓝色 = 5 赫兹,红色 = 15 赫兹,黄色 = 蓝色 + 红色。来自 "Yellow" Wave 的 FFT,看起来不错:
好的,那我改数据了。现在我有两个振幅相同但相位相反的波。如果我添加它们,它们的振幅为 0 - 这对我来说似乎是正确的。
两个相位相反的波。黄色 - Wave1+Wave2 + 黄色波的奇怪 FFT:
现在是我完全不明白的部分。这是我的问题:
1) 即使我在图片上看到这第三个黄色波的振幅等于0,数据表中也不是这样。添加两个主波后(并且它们具有相反的数据!)我得到了奇怪的结果。
示例:数据中的前 5 个点
第 1 波:
- 0,0627905195293128
- 0,125333233564304
- 0,187381314585724
- 0,248689887164855
- 0,309016994374947
第 2 波:
- -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');
非常感谢您...
玛丽
首先,你的计算是正确的。
因为两个图是自动调整大小的,所以很容易在解释它们时出错,但是第二个的振幅比第一个小得多(分别为10e-16 vs. 10e1
)。
在第二张图上,让您感到困惑的是,您只是数字错误的受害者:这些数字可以解释为0
。
从那里,你有两个简单的解决方案:
- 你对你得到的结果很满意,你可以调整数字以相同比例显示结果以避免任何误导性解释
- 你想要 "proper zero values" 而不是 "small ones"
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 变量,适用于此类情况。