我正在DSP处理器上实现BFSK实现,目前正在使用C在LINUX机器上进行模拟。我正在研究解调功能,它涉及对输入数据进行FFT。出于模拟目的,我有一个预定义的DFT函数:
void dft(complex_float* in, complex_float* out, int N, int inv)
{
int i, j;
float a, f;
complex_float s, w;
f = inv ? 1.0/N : 1.0;
for (i = 0; i < N; i++) {
s.re = 0;
s.im = 0;
for (j = 0; j < N; j++) {
a = -2*PI*i*j/N;
if (inv) a = -a;
w.re = cos(a);
w.im = sin(a);
s.re += in[j].re * w.re - in[j].im * w.im;
s.im += in[j].im * w.re + in[j].re * w.im;
}
out[i].re = s.re*f;
out[i].im = s.im*f;
}
这里complex_float
是一个定义如下的结构:
typedef struct {
float re;
float im;
} complex_float;
在dft()
函数中,参数N
表示DFT点的数量。
我怀疑的是,由于该算法还涉及跳频序列,在解调信号时,我需要检查不同频率成分信号的DFT幅度。
在MATLAB中,这非常简单,因为FFT功能也涉及采样频率,我可以在任何频率点找到功率
powerat_at_freq = floor((freq * fftLength) / Sampling_freq)
但C功能不涉及任何频率,那么如何确定任何特定频率的DFT幅度?
答案 0 :(得分:3)
特定频率的FFT表中的索引计算如下:
int i = round(f / fT*N)
其中f
是所需频率,fT
是采样频率,N
是FFT点数。
FFT应该是细粒度的(即N应该很大)以覆盖所有频率。
如果FFT中不存在精确频率,则将使用最近的频率。更多
有关FFT指数与频率的信息:
答案 1 :(得分:1)
表示的频率取决于馈送到它的数据的采样率(除以FFT的长度)。因此,任何DFT或FFT都可以通过以正确的采样率为其提供适量的数据来表示您想要的任何频率。
答案 2 :(得分:0)