在C#中重新映射FFT频率仓分布

时间:2011-03-07 18:49:47

标签: c# math fft

我为我正在使用的数据集编写了FFT。我的目的是创建结果的瀑布图,但我遇到的问题是如果我改变输入数据大小,那么我得到不同数量的频率仓。目前我只是将输入数据集的大小设置为我需要映射到的像素数的两倍。我试图找出一种方法将任何数据集大小的频率区域映射到特定数量的像素。例如,将500个值的数组映射到1250个元素长的数组。如果可以选择在数据映射上执行线性和非线性插值,那将会很不错。我也可能需要采用另一种方式,比如将值映射到300个元素长的数组。我不是一名数学专业的学生,​​而且我在这个问题上想出了一个空白。

2 个答案:

答案 0 :(得分:2)

您需要做的就是将您的输入填充到要显示的像素数。这可以通过简单地在输入中附加零来实现,使其达到您想要的长度(以像素为单位)。执行FFT时,它将在零填充后的长度内完成,并为您提供与像素相同数量的输出样本。

当您对FFT输入进行零填充时,FFT基本上会自动在频域中进行插值。检查this。请注意,即使频域样本的数量增加,实际上也不会在频域中提供更多信息(新频率内容不会仅通过使用此方法出现)。这只是过度采样现有数据。

我不确定采用其他方式的最佳方式(下采样),但我认为一种方法是只转换您需要的前N个样本。你会丢失数据,但根据应用程序的不同,这可能无关紧要。

答案 1 :(得分:1)

离散傅立叶变换(快速或非快速)将始终为您提供与输入数组相同大小的输出数组。如果你想扩展它,那么你需要看一下使用合适窗口的sinc函数。参见例如http://en.wikipedia.org/wiki/Lanczos_resampling