poster
2019-12-10, 20:30
该问题基于先前的类似问题。 (https://stackoverflow.com/questions/992509/determining-if-a-dataset-approximates-a-sine-wave)
我有以下等式和经过调整的(一些随机数据):0.44 * sin(N * 2 * PI / 30)
我正在尝试使用FFT从生成的数据中获取频率。但是频率最终接近但不等于频率(这使波比预期的大一点)
FFT的最大频率为7hz,但是预期的频率为(30 / 2PI)4.77hz。
我已经包括了FFT和绘制值的图表。
https://imgur.com/b1HGQ.jpg
我使用的代码是:
[sampleFFTValues sFreq] = positiveFFT(sampledata, 1); sampleFFTValues = abs(sampleFFTValues); [v sFFTV]= max(sampleFFTValues) 正FFT可以在这里找到 (http://blinkdagger.com/matlab/matlab-introductory-fft-tutorial/) 。基本上,它使FFT图居中并切断负信号。
我的问题是,如何才能使FFT更加精确,而不必仅针对频率求最小二乘?
回答:
我认为FFT对于(准)周期信号的精细分辨率频率测量不是很好-见下文。
每个离散FFT都在非整数bin频率上扩展(即在与特定FFT的频率步长不完全对应的任何频率上);这些“中间”频率将在最接近的整数档周围涂抹/散布。这种扩展的形状(“扩展功能”)取决于用于FFT的窗口功能。这种扩展功能(用于简化和概括事物)要么非常狭窄但非常参差不齐(非常高的峰/非常低的山谷),或者更宽泛但不那么参差不齐。从理论上讲,您可以对正弦波进行非常精细的频率扫描,并为每个正弦波计算FFT,然后可以通过保存所有FFT的输出以及产生该输出的频率来“校准”函数的形状和行为,然后将要测量的信号的FFT输出与先前保存的结果进行比较,然后找到“最近”的频率,从而找到更精确的频率。
很大的努力。
但是,如果仅需要测量单个信号的频率,则不要这样做。
而是尝试测量波长。这可以很简单,例如测量零交叉点之间的距离(可能需要多个周期才能获得更高的精度-哎呀,如果有那么多的话就测量1000个周期),然后将采样率除以该频率即可得出频率。更简单,更快,更精确。
例如:仅使用最粗略的方法测量一个周期的长度,即可获得48000 Hz的采样率,4.77 Hz的信号,分辨率约为0.0005 Hz。 (如果使用n个周期,则频率分辨率也将乘以n 。)
更多&回答... (https://stackoverflow.com/questions/2112766)
我有以下等式和经过调整的(一些随机数据):0.44 * sin(N * 2 * PI / 30)
我正在尝试使用FFT从生成的数据中获取频率。但是频率最终接近但不等于频率(这使波比预期的大一点)
FFT的最大频率为7hz,但是预期的频率为(30 / 2PI)4.77hz。
我已经包括了FFT和绘制值的图表。
https://imgur.com/b1HGQ.jpg
我使用的代码是:
[sampleFFTValues sFreq] = positiveFFT(sampledata, 1); sampleFFTValues = abs(sampleFFTValues); [v sFFTV]= max(sampleFFTValues) 正FFT可以在这里找到 (http://blinkdagger.com/matlab/matlab-introductory-fft-tutorial/) 。基本上,它使FFT图居中并切断负信号。
我的问题是,如何才能使FFT更加精确,而不必仅针对频率求最小二乘?
回答:
我认为FFT对于(准)周期信号的精细分辨率频率测量不是很好-见下文。
每个离散FFT都在非整数bin频率上扩展(即在与特定FFT的频率步长不完全对应的任何频率上);这些“中间”频率将在最接近的整数档周围涂抹/散布。这种扩展的形状(“扩展功能”)取决于用于FFT的窗口功能。这种扩展功能(用于简化和概括事物)要么非常狭窄但非常参差不齐(非常高的峰/非常低的山谷),或者更宽泛但不那么参差不齐。从理论上讲,您可以对正弦波进行非常精细的频率扫描,并为每个正弦波计算FFT,然后可以通过保存所有FFT的输出以及产生该输出的频率来“校准”函数的形状和行为,然后将要测量的信号的FFT输出与先前保存的结果进行比较,然后找到“最近”的频率,从而找到更精确的频率。
很大的努力。
但是,如果仅需要测量单个信号的频率,则不要这样做。
而是尝试测量波长。这可以很简单,例如测量零交叉点之间的距离(可能需要多个周期才能获得更高的精度-哎呀,如果有那么多的话就测量1000个周期),然后将采样率除以该频率即可得出频率。更简单,更快,更精确。
例如:仅使用最粗略的方法测量一个周期的长度,即可获得48000 Hz的采样率,4.77 Hz的信号,分辨率约为0.0005 Hz。 (如果使用n个周期,则频率分辨率也将乘以n 。)
更多&回答... (https://stackoverflow.com/questions/2112766)