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

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

现在是我完全不明白的部分。以下是我的问题:
( 1)即使我在图片上看到第三个黄波的振幅等于0,也不像数据表中的那样。在添加两个主波之后(它们有相反的数据!)我得到了奇怪的结果。
示例:数据中的5点
第一波:
第二波:
第三波(和):
为什么这些波的和不等于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');快速傅立叶变换码:
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');谢谢你提前..。
玛丽
发布于 2017-07-28 10:21:35
首先,的计算是正确的。
由于这两个图是自动调整大小的,很容易出错解释它们,但振幅在第二个比第一个(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变量,用于这种情况。
https://stackoverflow.com/questions/45369193
复制相似问题