C# 如何获得FFT中每个值的频率?

C# 如何获得FFT中每个值的频率?,c#,signal-processing,fft,C#,Signal Processing,Fft,我有一个FFT结果。它们存储在两个double数组中:一个实部数组和一个虚部数组。如何确定这些阵列中每个元素对应的频率 换句话说,我想创建一个数组来存储我的FFT的每个实部和虚部的频率。你的第k个FFT结果的频率是2*pi*k/N。看看我的答案 回复评论: FFT实际使用正弦和余弦函数(基函数)在等间隔频率范围内计算输入信号的频率。对于给定的FFT输出,有一个对应的频率(F),如我发布的答案所示。输出样本的实部是输入信号与cos(2*pi*F*t)的互相关,虚部是输入信号与sin(2*pi*F*

我有一个FFT结果。它们存储在两个
double
数组中:一个实部数组和一个虚部数组。如何确定这些阵列中每个元素对应的频率

换句话说,我想创建一个数组来存储我的FFT的每个实部和虚部的频率。

你的第k个FFT结果的频率是2*pi*k/N。

看看我的答案

回复评论:

FFT实际使用正弦和余弦函数(基函数)在等间隔频率范围内计算输入信号的频率。对于给定的FFT输出,有一个对应的频率(F),如我发布的答案所示。输出样本的实部是输入信号与
cos(2*pi*F*t)
的互相关,虚部是输入信号与
sin(2*pi*F*t)
的互相关。输入信号与
sin
cos
函数相关的原因是为了说明输入信号和基函数之间的相位差


通过获取复FFT输出的幅值,可以测量输入信号在一组频率下与正弦信号的相关性,而不考虑输入信号的相位。如果您只是分析信号的频率内容,您几乎总是会采用FFT复输出的幅度或幅度平方。

FFT中的第一个箱子是DC(0 Hz),第二个箱子是
Fs/N
,其中
Fs
是采样率,
N
是FFT的大小。下一个箱子是
2*Fs/N
。一般来说,第n个bin是
n*Fs/n

因此,如果采样率,
Fs
为44.1 kHz,且FFT大小,
N
为1024,则FFT输出箱位于:

  0:   0 * 44100 / 1024 =     0.0 Hz
  1:   1 * 44100 / 1024 =    43.1 Hz
  2:   2 * 44100 / 1024 =    86.1 Hz
  3:   3 * 44100 / 1024 =   129.2 Hz
  4: ...
  5: ...
     ...
511: 511 * 44100 / 1024 = 22006.9 Hz

请注意,对于实输入信号(虚部均为零),FFT的后半部分(从
N/2+1
N-1
)不包含任何有用的附加信息(它们与第一个
N/2-1
单元具有复共轭对称性)。最后一个有用的bin(用于实际应用)位于
N/2-1
,对应于上述示例中的22006.9 Hz。
N/2
处的bin表示奈奎斯特频率处的能量,即
Fs/2
(=本例中为22050 Hz),但这通常没有任何实际用途,因为抗混叠滤波器通常会衰减FFT输出系数(对于大小为N的复杂输入)处及以上的任何信号从0到N-1,分组为[低、中、高、高、中、低]频率

我认为K的元素具有与N-K元素相同的频率,因为对于实际数据,FFT[N-k] = FFT[k]的复合共轭。 扫描频率从低到高的顺序是

0,

 1,
 N-1,

 2,
 N-2

 ...

 [N/2] - 1,
 N - ([N/2] - 1) = [N/2]+1,

 [N/2]
从指数i=0到[N/2]有[N/2]+1组频率,每组具有
frequency=i*SamplingFrequency/N

因此,bin FFT[k]处的频率为:

if k <= [N/2] then k * SamplingFrequency / N
if k >= [N/2] then (N-k) * SamplingFrequency / N
如果k=[N/2],则(N-k)*采样频率/N

我使用了以下方法:

public static double Index2Freq(int i, double samples, int nFFT) {
  return (double) i * (samples / nFFT / 2.);
}

public static int Freq2Index(double freq, double samples, int nFFT) {
  return (int) (freq / (samples / nFFT / 2.0));
}
输入为:

  • i
    :要访问的Bin
  • 采样
    :以赫兹为单位的采样率(即8000赫兹、44100赫兹等)
  • nFFT
    :FFT向量的大小

我是用C#net做的。你能帮我吗?如果你不理解FFT的实部和虚部的相关性,那么你就不会得到任何有意义的结果,所以你应该寻找一些FFT和信号处理教程来理解如何解释结果。我认为不管你用它做什么,你很可能想要FFT的幅度或功率谱密度。谢谢!我想得到每帧的峰值频率(帧长度取决于窗口长度和移位长度),实部和虚部是FFT的结果,用于?请给我解释一下。谢谢,是不是复杂产出的数量每次都要翻一番?(如果我将我的解释限制在下半部分)注意——答案稍有错误——第512个桶包含22050的液位,即奈奎斯特极限。箱子0到N/2(含)包含有用的值。感谢编辑和澄清。。。我想这就是我暴露出一些缺乏实用性的地方。我:但是主人,我们要把工作交给奈奎斯特!你:学徒,你真的应该把它过滤掉。我希望我能找到答案。这个答案比原来的问题还要好@保罗-我想感谢你多年来为我提供的这个美妙的答案。在我拥有StackOverflow帐户之前,我会访问这个答案,而我实际上忘记了在注册后感谢你。我最近在看FFT的东西,我记得你的答案,只是现在访问它。我一到这里就记得要谢谢你。。。谢谢你!每当我与某人就如何解释FFT横轴上的每一点进行辩论时,我都会将他们指向这个链接。@rayryeng:非常感谢你-我认为这是我在这里回答问题5年来所得到的最好的承认!人们无法确切地知道您用
样本
nFFT
表示什么。所以请解释一下。公认的答案是这应该是
i*samples/nFFT
。为什么有额外的
2
?我遗漏了什么吗?我想这会是弧度