作者 主题:为什么FFT无法正确计算第二次谐波? (Read 2922 times)

0会员和1位客人正在查看此主题。

离线 ali_asadzadeh.

  • 超级贡献者
  • ***
  • 帖子:1376
  • 国家: 加利福尼亚州
为什么FFT无法正确计算这一第二次谐波?
« on: 2018年12月24日,01:31:03 PM»
你好,
我用F和2 * F频率产生了两个SIN波,假设我具有50Hz信号和100Hz信号,在50Hz信号的一个周期中具有相等的幅度和64个样本

这里 is the Matlab code
t = linspace(0,2 * pi,64);
x = SIN(T);
y = sin(2 * t);
sum = x + y;

你 can see all the signals at once


现在,当我用这个matlab命令得到全波fft时,结果似乎可以,

ABS(FFT(SUM))/ 64

结果是这样,就像你看到第一和第二次谐波一样具有几乎相同的幅度,


现在,如果我尝试剪切32个数据样本(从某个点到32个样本)并仅计算FFT的32个样本,我应该能够正确地看到100Hz幅度数据,因为至少有一个循环在该窗口中的100Hz波数据,但正如您所看到的,似乎32个样本数据内没有100Hz数据。

这里 is the Matlab code

S = SUM(16:47);

而FFT看起来像这样

ABS(FFT(S))/ 32



我错过了什么?你有什么主意吗?
I'M数字专家来自8位到64位
 

离线 马可

  • 超级贡献者
  • ***
  • 帖子:5033
  • 国家: NL.
Re:为什么FFT无法正确计算第二次谐波?
« 回复#1开: 2018年12月24日,03:04:02 PM»
你应该'使用任何旧FFT来做DFT,FFT'S通常复杂的FFT ......并实现您需要的DFT"real"FFT(即实时域输入 - >正交频域输出)。你是谁'现在拒绝是完整的废话。即使你做对了(即使用DFT而不是)你也会'T在第二种情况下,请参阅最低频率信号。

首先让我们开始思考并更清楚地表达问题。大学教师'说dft说fft。大学教师'T表示50或100Hz,频率为1/64和1/32。当您采取32个样本时,DFT的最低频率除DC以外的箱子是1/32 ... 1/64简单地没有'还有一个垃圾箱。

It'S有用的是将DFT视为周期性,您可以重复您正在转换的块,并产生相同的DFT结果。那么在你重复32个样本窗口时会发生什么?您在界限下突然跳跃,这意味着高频分量。低频1/64的所有能量已被转移到高频和DC。在第一个频率箱中只有1/32仍然存在。
« 上次编辑:2018年12月24日,03:16:01 PM由Marco »
 

离线

  • 频繁的贡献者
  • **
  • 帖子:686
Re:为什么FFT无法正确计算第二次谐波?
« 回复#2开: 2018年12月24日,03:30:07 PM»
再次尝试使用包含100左右的时间序列,您想要测量的东西,并且您将获得更多的理智结果。
你'LL需要Hz的X轴,以解释FFT-BIN对应于什么频率。

numpy / matlab也可以为psd具有更多用户友好的高级功能(例如,"pwelch" or similar)
 

在线的 rstofer.

  • 超级贡献者
  • ***
  • 帖子:7976
  • 国家: 我们
Re:为什么FFT无法正确计算第二次谐波?
« 回复#3开: 2018年12月24日,04:33:28 PM»
这是帮助吗?

http://icrf.nl/Portals/0/Matlab/DFT_and_Matlab.pdf

很多数学和例子
 

离线 Dmendesf.

  • 常规贡献者
  • *
  • 帖子:171
  • 国家: 布尔
Re:为什么FFT无法正确计算第二次谐波?
« 回复#4开: 2018年12月24日,08:40:54 PM »
这是对DFT / DFT的常见误解。大多数人都理解它"Bin n具有精确的幅度/次谐波,总是"。这不是真的。它的工作方式:"如果输入是N次谐波的总和,那么BIN N具有顺序的精确幅度/相位"。如果违反此规则,则FFT可以具有任意数据。一世'从我的手机上发帖,但我的时候'm at the computer I'LL发布到具有交互式FFT / DFT小程序的站点的链接,可让您实时更改输入向量并查看输出以查看它具有哪些影响。
 

离线 nick_d.

  • 常规贡献者
  • *
  • 帖子:120
Re:为什么FFT无法正确计算第二次谐波?
« 回复#5: 2018年12月24日,09:41:07 PM»
首先,利用叠加I. .. FFT(x + y)= fft(x)+ fft(y)。所以他们分开看看什么'什么。在截断后,您的100 Hz将显示为尖峰。你的50赫兹有一个"hump"在截断后将显示为所有频率的涂片。驼峰由DC加上低频正弦波相移位以在驼峰中心和边缘处的负峰值中具有正峰值。这将在边缘呈现错误的形状"correct"通过应用更高的频率,我认为全部。您也可能发现负频率很重要。我不'T同意早期的帖子绘制DFT和FFT之间的区别。 FFT是DFT的计算方法,其通过巧妙的术语通过巧妙的分组获得n log n复杂性。对于这种工作,DFT同样好,使用FFT进行性能。 DFT的替代方案是仅使用计算机代数包的连续FT,并且没有有意义地应用于离散值的向量。
干杯,尼克
 
以下用户感谢此帖子: rs20

离线 ali_asadzadeh.

  • 超级贡献者
  • ***
  • 帖子:1376
  • 国家: 加利福尼亚州
Re:为什么FFT无法正确计算第二次谐波?
« 回复#6开启: 2018年12月25日,11:34:55 AM»
引用
你应该'使用任何旧FFT来做DFT,FFT'S通常复杂的FFT ......并实现您需要的DFT"real"FFT(即实时域输入 - >正交频域输出)。你是谁'现在拒绝是完整的废话。即使你做对了(即使用DFT而不是)你也会'T在第二种情况下,请参阅最低频率信号。

首先让我们开始思考并更清楚地表达问题。大学教师'说dft说fft。大学教师'T表示50或100Hz,频率为1/64和1/32。当您采取32个样本时,DFT的最低频率除DC以外的箱子是1/32 ... 1/64简单地没有'还有一个垃圾箱。

It'S有用的是将DFT视为周期性,您可以重复您正在转换的块,并产生相同的DFT结果。那么在你重复32个样本窗口时会发生什么?您在界限下突然跳跃,这意味着高频分量。低频1/64的所有能量已被转移到高频和DC。在第一个频率箱中只有1/32仍然存在。
FFT只是DFT,但我们以快速的方式完成了它 :) ;) ;)

感谢您的回复,所以,您是否知道如何从32个子样本中提取100Hz?
I'M数字专家来自8位到64位
 

离线 戴夫

  • 超级贡献者
  • ***
  • 帖子:1283
  • 国家: SI.
  • 我喜欢衡量事物。
Re:为什么FFT无法正确计算第二次谐波?
« 回复#7: 2018年12月25日,下午12:09:40»
问题是使用Linspace。点之间的间距是'2 * pi的1/64,但2 * pi的1/63。该功能将样本空间空间,因此第一个和最后一个样本直接下降到您指定的范围内。因此,SIN(x)的频率不是1,但是64/63。

更换第一行
Linspace(0,2 * Pi *(63/64),64)
FFT将显示两个频率分量相等。 :-+
<fellbuendel> it's arduino, you'不应该了解你的任何东西're doing
<fellbuendel>如果你知道,你会't be using it
 
以下用户感谢此帖子: eBaster.

离线 ali_asadzadeh.

  • 超级贡献者
  • ***
  • 帖子:1376
  • 国家: 加利福尼亚州
Re:为什么FFT无法正确计算第二次谐波?
« 回复#8开: 2018年12月25日,01:08:04 PM»
引用
问题是使用Linspace。点之间的间距是'2 * pi的1/64,但2 * pi的1/63。该功能将样本空间空间,因此第一个和最后一个样本直接下降到您指定的范围内。因此,SIN(x)的频率不是1,但是64/63。

更换第一行
Linspace(0,2 * Pi *(63/64),64)
FFT将显示两个频率分量相等。 :-+
戴夫谢谢,它修复了第一个FFT问题,并为50Hz和100Hz信号产生了一个漂亮的0.5,



但下半场有能量在每个垃圾箱中分裂!


而100Hz信号没有那里的峰值,有没有办法绕过这个问题?
I'M数字专家来自8位到64位
 

离线 戴夫

  • 超级贡献者
  • ***
  • 帖子:1283
  • 国家: SI.
  • 我喜欢衡量事物。
Re:为什么FFT无法正确计算第二次谐波?
« 回复#9: 2018年12月25日,02:14:24 PM»
偏移偏振的半个时期与另一个高谐波的弦波没有正交,因此非零结果正是你的'D期待看到。尝试在同样的剪辑数据上只用SIN(2x)作为输入,您只会在第二箱中看到一个峰值(由于某种原因,拨打了100hz)。
<fellbuendel> it's arduino, you'不应该了解你的任何东西're doing
<fellbuendel>如果你知道,你会't be using it
 

离线 Geoffreyf.

  • 常规贡献者
  • *
  • 帖子:217
  • 国家: 我们
Re:为什么FFT无法正确计算第二次谐波?
« 回复#10: 2018年12月25日,06:45:40 PM»
您所示的单个周期也具有急剧切断,产生谐波。 理想的FFT是为了过去从过去开始的东西,并在未来无限地结束。 通常,样本信号具有很多循环,从非常小的幅度开始并结束相同。

一个循环就是这样,它'甚至没有时间近似波浪。
美国业余额外的W1GCF。
 

离线 康拉德霍夫曼

  • 超级贡献者
  • ***
  • 帖子:1373
  • 国家: 我们
    • 凌乱的地下室
Re:为什么FFT无法正确计算第二次谐波?
« 回复#11开: 2018年12月25日,07:13:41 PM»
因此,窗口可以在大约十几种不同的方式完成。
 

离线 ali_asadzadeh.

  • 超级贡献者
  • ***
  • 帖子:1376
  • 国家: 加利福尼亚州
Re:为什么FFT无法正确计算第二次谐波?
« 回复#12: 2018年12月26日,06:21:50 AM»
引用
因此,窗口可以在大约十几种不同的方式完成。
谢谢,我也在考虑窗口,任何想法是什么类型,我应该如何应用?
I'M数字专家来自8位到64位
 

离线 马可

  • 超级贡献者
  • ***
  • 帖子:5033
  • 国家: NL.
Re:为什么FFT无法正确计算第二次谐波?
« 回复#13开启: 2018年12月26日,下午12:31:33»
感谢您的回复,所以,您是否知道如何从32个子样本中提取100Hz?

零垫32个样本到64,然后做DFT。但是你'RE没有真正提取1/64频率信号,您假设它'S存在并基于该假设确定它'S力量。它可以也不是,32个样本信号是一个完全有效的周期性信号,没有任何1/64频率分量。
 

离线 放射性

  • 常规贡献者
  • *
  • 帖子:176
  • 国家: 我们
Re:为什么FFT无法正确计算第二次谐波?
« 回复#14: 2018年12月27日,02:37:40»
问题是,即使剪切样本为32长度仍包含较短的波长,它仍然是一个复合信号。 随着其他人提到的,切口导致有限序列的边界是非零的。 这导致FFT中的许多不期望的输出。 窗口可用于强制边界到零。 我将切口的起点更改为进入32样品序列和应用三角窗口的1/8。 有点诀窍的问题,所以这里有点答案:   如果没有别的,它会显示如何进行窗口和零填充。

代码: [选择]
pkg load signal
N=4096; %zero pad results to N-bin fft
t = linspace(0,2 * pi,64);
x = SIN(T);
y = sin(2 * t);
s1= x + y;
s2= s1((64/8):(64/8)+length(s1)/2-1); %grab half(32) the samples from s1 starting 1/8 in
win1=triang(length(s1)); %generate triangular windows
win2=triang(length(s2));
k1=24  %gain adj for win1
k2=k1/2  %gain adj for win2
s1 = s1.*win1'; %apply windows to samples
s2 = s2.*win2';
s1 = [zeros(1,N/2-32) s1 zeros(1,N/2-32)];  %zero pad for higher-res fft
s2 = [zeros(1,N/2-16) s2 zeros(1,N/2-16)];
fft1 = abs(fft(s1)); %get the mag of fft
fft2 = abs(fft(s2));
plot( fft1(1:length(fft1)/2)/k1, '*r' );
hold on;
plot( fft2(1:length(fft2)/2)/k2, '+b' );
hold off;


 
以下用户感谢此帖子: ali_asadzadeh.

离线 ali_asadzadeh.

  • 超级贡献者
  • ***
  • 帖子:1376
  • 国家: 加利福尼亚州
Re:为什么FFT无法正确计算第二次谐波?
« 回复#15: 2018年12月27日,上午10:11:28»
引用
问题是,即使剪切样本为32长度仍包含较短的波长,它仍然是一个复合信号。 随着其他人提到的,切口导致有限序列的边界是非零的。 这导致FFT中的许多不期望的输出。 窗口可用于强制边界到零。 我将切口的起点更改为进入32样品序列和应用三角窗口的1/8。 有点诀窍的问题,所以这里有点答案:   如果没有别的,它会显示如何进行窗口和零填充。
谢谢,在16:47点的任意起点中有没有这样做?
I'M数字专家来自8位到64位
 

离线 ali_asadzadeh.

  • 超级贡献者
  • ***
  • 帖子:1376
  • 国家: 加利福尼亚州
Re:为什么FFT无法正确计算第二次谐波?
« 回复#16开: 2018年12月27日,上午11:25:15»
你的解决方案也有一些问题,因为我'm在Cortex M设备中进行FFT,资源有限和时间有限,我将原始信号降低到32个样本,因此FFT将更快,需要更少的RAM资源!在4096个样本中做到这一点,Windows大小将是一个过度杀戮,因为我在1毫秒以下才能在几个同步的数据渠道上做这件事,所以任何新的想法?
I'M数字专家来自8位到64位
 

离线 nick_d.

  • 常规贡献者
  • *
  • 帖子:120
Re:为什么FFT无法正确计算第二次谐波?
« 回复#17开: 2018年12月29日,07:26:16 PM»
是的,有很多方法可以在没有FFT的情况下分离频率。 IIR过滤器将是一个有效的选择。如果需要处理频谱(但通常不必要),则小波变换将变换。我们可以有申请的详细信息吗?
干杯,尼克
 

在线的 rstofer.

  • 超级贡献者
  • ***
  • 帖子:7976
  • 国家: 我们
Re:为什么FFT无法正确计算第二次谐波?
« 回复#18开启: 2018年12月30日,01:21:06»
这里'一些Matlab代码我从Mathworks网站抓住并改变了足以添加几个谐波。

代码: [选择]
Fs=1000;
T=1/Fs;
NFFT=256;
FFTperiod=256*T;
t=(0:NFFT-1)*T;
str=['FFT period is ',num2str(FFTperiod), ' seconds'];
Freq=10*1/FFTperiod
strFreq =['Frequency is ', num2str(Freq), ' Hz'];
Freqbin =1/FFTperiod
strFreqbin =['FFT frequency bin is ',num2str(1/FFTperiod), ' Hz'];
strFreqNyquist =['FNyquist is ',num2str(1/FFTperiod*256/2), ' Hz'];
disp(str);
disp(strFreq);
disp(strFreqbin);
disp(strFreqNyquist);
x=sin(2*pi*Freq*t)+(sin(6*pi*Freq*t)/3)+(sin(10*pi*Freq*t)/5);
subplot(2,1,1)
plot(t,x);
title('time domain signal')
Y=fft(x,NFFT)/NFFT;
f=Fs/2*linspace(0,1,NFFT/2);
subplot(2,1,2);
plot(f,20*log10(2*abs(Y(1:NFFT/2))))
title('FFT magnitude in dB20')
 

离线 ali_asadzadeh.

  • 超级贡献者
  • ***
  • 帖子:1376
  • 国家: 加利福尼亚州
Re:为什么FFT无法正确计算第二次谐波?
« 回复#19: 2018年12月30日,07:02:18 AM»
感谢Rstofer,因为应用应该如此迅速,我只能在1个完整的仙周期中做FFT,并且对于第二个谐波也希望能够计算它在完整的第一次谐波周期的一半周期。
I'M数字专家来自8位到64位
 

在线的 rstofer.

  • 超级贡献者
  • ***
  • 帖子:7976
  • 国家: 我们
Re:为什么FFT无法正确计算第二次谐波?
« 回复#20开: 2018年12月30日,06:13:12 PM»
感谢Rstofer,因为应用应该如此迅速,我只能在1个完整的仙周期中做FFT,并且对于第二个谐波也希望能够计算它在完整的第一次谐波周期的一半周期。
执行时间似乎高度变量,但第一个执行非常慢。

1)125毫秒
2)798美国
3)257美国
4)153美国
5)512美国

这是我的表面预订,带有I7-6600 2.6 GHz处理器。 我想它会在我的i7-7700桌面上运行很多,但我只有一台机器的许可Matlab。

我不'认为你将逃脱的2D信号的一个周期,因为它需要填充'something'在第一信号的某些整数倍数下成为连续信号。 除了2D信号的另一个周期之外的任何填充将导致谐波到处(我认为)。

什么样的信号作为SIN()运行1个循环,0V为1个循环,然后永远重复? 平方波和SIN()波的复合将这样做,但我们已经知道方波具有从DC到日光的奇怪谐波。
 

离线 康拉德霍夫曼

  • 超级贡献者
  • ***
  • 帖子:1373
  • 国家: 我们
    • 凌乱的地下室
Re:为什么FFT无法正确计算第二次谐波?
« 回复#21开: 2018年12月30日,06:17:05 PM»
那里'有一些很好的公共FFT代码可用。如果您想要快速,请自己代码。 http://www.fftw.org/
 

离线 ehughes.

  • 频繁的贡献者
  • **
  • 帖子:406
  • 国家: 我们
Re:为什么FFT无法正确计算第二次谐波?
« 回复#22: 2018年12月31日,01:58:30»
大学教师't forget that but "not windowing"  you are still "windowing"有一个矩形窗口。       您正在看到SIN(x)/ x函数的交互 转移到不同的垃圾箱并总结起来。

在大多数垃圾箱的情况下,你得到了所有的零。   SIN(x)的叠加仍在那里, 箱子只需在窗口函数中排列。

在现实世界案件中,   您的音调永远不会排列,使窗口函数的空在FFT中的垃圾箱处。   您将始终查看窗口的影响(矩形或其他)。 在进行处理时,这只是你必须要注意的事情。


 
以下用户感谢此帖子: 鲍勃

在线的 rerouter.

  • 超级贡献者
  • ***
  • 帖子:4673
  • 国家: Au.
  • 质疑一切......除了这个陈述
Re:为什么FFT无法正确计算第二次谐波?
« 回复#23开: 2018年12月31日,02:38:44»
执行时间似乎高度变量,但第一个执行非常慢。

1)125毫秒
2)798美国
3)257美国
4)153美国
5)512美国

首次运行刚刚编译我的尖叫声,稍后只需要运行它的副码。
 

离线 ali_asadzadeh.

  • 超级贡献者
  • ***
  • 帖子:1376
  • 国家: 加利福尼亚州
Re:为什么FFT无法正确计算第二次谐波?
« 回复#24开: 2018年12月31日,上午11:53:52»
引用
执行时间似乎高度变量,但第一个执行非常慢。

1)125毫秒
2)798美国
3)257美国
4)153美国
5)512美国

谢谢,我将使用ARM DSP库在200MHz Cortex M4部分上运行FFT :) 我有8个数据渠道,所以我认为我最多只能填充到128个样本,所以我应该选择什么窗口?

请注意,我的ADC在DMA的帮助下在ISR中采样所有8个通道,因此我应该更新每个循环测量并进行一些决策,并根据结果进行一些操作。所以关于所有其他事情,包括抽样和时间'我可以为我提供,我应该找到一个快速,记忆有效的方法来做。
I'M数字专家来自8位到64位
 


分享我

掘客  Facebook  诽谤  可口的  Technorati.  推特  谷歌  雅虎
SMF.