math - 正弦波频率拟合

标签 math matlab fft octave data-fitting

这个问题是基于一个previous similar question.

我有以下等式和调整后的(一些随机数据):0.44*sin(N* 2*PI/30)

我正在尝试使用 FFT 从生成的数据中获取频率。然而,频率最终接近但不等于频率(这使得波比预期的大一点)

FFT 的最大频率为 7hz,但预期频率为 (30/2PI) 4.77hz。

我已经包含了 FFT 和绘制值的图表。

alt text

我使用的代码是:

[sampleFFTValues sFreq] = positiveFFT(sampledata, 1);
sampleFFTValues = abs(sampleFFTValues);
[v sFFTV]= max(sampleFFTValues)

正FFT可以是found here .基本上它使 FFT 图居中并切断负信号。

我的问题是,如何才能使 FFT 更加准确,而不必仅针对频率求助于最小二乘法?

最佳答案

我认为 FFT 不适用于(准)周期信号的高分辨率频率测量 - 见下文。

每个离散 FFT 都在非整数仓频率上扩展(即在不完全对应于特定 FFT 的频率步长之一的任何频率上);这些“中间”频率将被涂抹/散布在最近的整数仓周围。这种扩展的形状(“扩展函数”)取决于用于 FFT 的窗口函数。这个传播函数——为了简化和概括事物——要么非常狭窄但非常参差不齐(非常高的峰值/非常低的谷值),要么更宽但不那么参差不齐。理论上,您可以对正弦波进行非常精细的频率扫描并计算每个正弦波的 FFT,然后您可以通过保存所有 FFT 的输出以及产生该输出的频率来“校准”函数的形状和行为,然后通过将要测量的信号的 FFT 输出与先前保存的结果进行比较,找到“最接近”的结果,找到更准确的频率。

很多努力。

但如果您只需要测量单个信号的频率,请不要这样做。

改为尝试测量波长。这可以像测量样本中的零交叉点之间的距离一样简单(可能需要多个周期以获得更高的精度 - 哎呀,如果有那么多,则测量 1000 个周期),然后将采样率除以得出频率。更简单、更快速、更精确。

示例:48000 Hz 采样率、4.77 Hz 信号产生约 0.0005 Hz 分辨率,只需使用最粗略的方法测量一个周期的长度。 (如果采用 n 个周期,频率分辨率也会乘以 n。)

关于math - 正弦波频率拟合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2112766/

相关文章:

image - 在MATLAB中,如何用图像注释图形?

matlab - 多列分组和绘图

javascript - 基于用户输入的价格计算 React JS

c# - c# 中的工作百分比

matlab:如何打印字符串和变量内联

numpy - FFT 卷积如何以及为什么比直接卷积更快?

python - FFT2 中心对称物体的非零虚部?

r - 从 FFT 中有效提取信号频率

生成列表组合的算法,其中每个索引的元素在列表之间交换

r - 无法将曲线拟合到数据集