C# 如何获得FFT中每个值的频率?
我有一个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*
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));
}
输入为:
:要访问的Bini
:以赫兹为单位的采样率(即8000赫兹、44100赫兹等)采样
:FFT向量的大小nFFT
样本
或nFFT
表示什么。所以请解释一下。公认的答案是这应该是i*samples/nFFT
。为什么有额外的2
?我遗漏了什么吗?我想这会是弧度