傅里叶变换FFT负频率分析

傅里叶变换FFT负频率分析

Q1: 为什么数字滤波器 π \pi π对应高频呢?

首先,此处的 π \pi π对应的是数字频率,为了更清楚的说明这个问题,需要明确数字频率和模拟频率之间的关系

数字角频率和模拟角频率

频率区分

  • 模拟频率 f f f,一般常用来表示信号频率
  • 模拟角频率 Ω \Omega Ω,其中 Ω = 2 π f \Omega=2\pi f Ω=2πf
  • 数字角频率 ω \omega ω,其中 ω = Ω / f s \omega=\Omega / {f_s} ω=Ω/fs

根据以上关系,则有频率为 f f f的信号 s s s其对应的数字频率 w w w可表示为
w = 2 π f f s = π f f s / 2 (1) w = \frac{2\pi f} {f_s} = \pi \frac{ f} {f_s /2} \tag{1} w=fs2πf=πfs/2f(1)
其中, f s f_s fs代表采样频率。

奈奎斯特采样定理

根据基带信号的奈奎斯特采样定理,采样频率 f s f_s fs必须高于信号最高频率 f m a x f_{max} fmax的2倍,即
f s ≥ 2 f m f_s \ge 2f_m fs2fm
为了表示简单,采样频频率的一半 f N y q u i s t = f s / 2 f_{Nyquist} = f_s / 2 fNyquist=fs/2又被称为奈奎斯特频率,它表示了采样后信号的有效范围,这意味着以 f s f_s fs采样,则超过 f s / 2 f_s / 2 fs/2的信号频率分量将不能被采到,即可表示为
f ≤ f m a x = f N y q u i s t = f s / 2 f \le {f_{max}} = f_{Nyquist} = f_s / 2 ffmax=fNyquist=fs/2

则式 ( 1 ) (1) (1)中的比例项是个归一化因子,可定义 γ \gamma γ表示为
γ = f f s / 2 \gamma = \frac{f}{f_s / 2} γ=fs/2f
由上式可得:频率越低, γ \gamma γ越接近0,而频率越高, γ \gamma γ越接近1。将以上结论代入到 ( 1 ) (1) (1)可得:

  • 低频的频率成分的数字频率对应于 0 0 0
  • 高频的频率成分的数字频率对应于 π \pi π

Q2:为什么FFT变换中前N/2点对应正频率,后N/2点对应负频率呢?

由于数字技术的广泛应用,离散傅里叶变换(Discrete Fourier Transformation, DFT) 被广泛应用于信号的频谱分析等,而快速傅里叶变换(Fast Fourier Transformation, FFT) 作为DFT算法的快速形式,一般频谱分析中,FFT更加常用。

要解释这个问题,需要从傅里叶变换到DFT变换的推导过程分析。

傅里叶变换

傅里叶变换一般指的是连续傅里叶变换,其定义如下:
X ( w ) = ∫ − ∞ ∞ x ( t ) e − j w t d t (2.1) X(w) =\int _{-\infty}^{\infty} x(t) e^{-jwt}dt \tag{2.1} X(w)=x(t)ejwtdt(2.1)

Q:既然有傅里叶变换了,为什么需要离散傅里叶变换呢?

从上式可以看出,傅里叶变换的正变换和逆变换都是正负无穷的连续积分,这尚可基于数学工具(微分和极限等)进行计算,但却不太方便在计算机上实现,因为计算机是个离散系统,因此就产生了离散傅里叶变换来解决这个问题,使用离散系统进行有限近似计算

离散时间傅里叶变换DTFT

在离散系统中,连续时间信号 x ( t ) x(t) x(t)要转换成离散时间信号,首先需要进行采样,采样频率为 f s f_s fs,采样点时间间隔为 T s = 1 / f s T_s = 1/ {f_s} Ts=1/fs,冲击采样序列为
δ s ( t ) = ∑ n = − ∞ ∞ δ ( t − n T s ) (2.2) \delta_s(t) = \sum \limits_{n=-\infty}^{\infty} \delta(t-n {T_s}) \tag{2.2} δs(t)=n=δ(tnTs)(2.2)
注意:这里的 t t t如果取得不是 T s T_s Ts的整数倍,则 δ s ( t ) \delta_s(t) δs(t)的值为0,即 δ s ( t ) = 0 \delta_s(t)=0 δs(t)=0
则取样之后的信号可表示为
x s ( t ) = ∑ n = − ∞ ∞ x ( t ) δ ( t − n T s ) (2.3) x_s(t) = \sum \limits_{n=-\infty}^{\infty} x(t) \delta(t-n {T_s}) \tag{2.3} xs(t)=n=x(t)δ(tnTs)(2.3)
对数字系统而言,我们只能获得采样后的离散序列 x [ n ] x\left[ n \right] x[n]

则采样后信号的傅里叶变换可表示为
X s ( w ) = ∫ − ∞ ∞ ∑ n = − ∞ ∞ x ( t ) δ ( t − n T s ) e − j w t d t (2.4) X_s(w) = \int_{-\infty}^{\infty} { \sum \limits_{n=-\infty}^{\infty} x(t) \delta(t-n {T_s})} e^{-jwt}dt \tag{2.4} Xs(w)=n=x(t)δ(tnTs)ejwtdt(2.4)
交换积分和求和次序可得
X s ( w ) = ∑ n = − ∞ ∞ ∫ − ∞ ∞ x ( t ) δ ( t − n T s ) e − j w t d t (2.4) X_s(w) = \sum \limits_{n=-\infty}^{\infty} { \int_{-\infty}^{\infty} x(t) \delta(t-n {T_s})} e^{-jwt}dt \tag{2.4} Xs(w)=n=x(t)δ(tnTs)ejwtdt(2.4)

由于 δ ( t ) \delta(t) δ(t)的筛选性
∫ − ∞ ∞ f ( x ) δ ( x − x 0 ) d x = f ( x 0 ) (2.5) { \int_{-\infty}^{\infty} f(x) \delta(x-x_0)} dx = f(x_0) \tag{2.5} f(x)δ(xx0)dx=f(x0)(2.5)
则可得
X s ( w ) = ∑ n = − ∞ ∞ x ( n T s ) e − j w n T s (2.6) X_s(w) = \sum \limits_{n=-\infty}^{\infty} x(n {T_s}) e^{-jwn{T_s}} \tag{2.6} Xs(w)=n=x(nTs)ejwnTs(2.6)
上式即为离散时间傅里叶变换。

离散傅里叶变换DFT

由式 ( 2.6 ) (2.6) (2.6)可知,离散时间傅里叶变换中的离散时间信号是一个无线长的序列,其范围为 [ − ∞ , ∞ ] \left[ -\infty, \infty \right] [,]

DFT的离散性与周期性

根据傅里叶变换中离散性与周期性的性质:

离散 ↔ 周期 离散 \leftrightarrow 周期 离散周期

  • 时间离散,则频域周期
  • 时域周期,则频域离散

因此式 ( 2.6 ) (2.6) (2.6)中的无限长的序列所对应的DTFT变换所得到的频谱是连续的。

然而,连续的频谱仍然不适合计算机处理,因此考虑将频率进行离散化。为了实现频谱的离散,必须考虑将时域信号变成周期信号,因此只能进行部分截断,并将其进行周期延拓至周期信号。

考虑将无限长的离散时间信号进行阶段至 N N N个采样点,然后将这个 N N N个采样点进行周期延拓,称为周期信号,此时其频谱为离散频谱。此时延拓后的周期信号的周期 T T T可表示为
T = N T s T = N {T_s} T=NTs
频率 f f f
f = 1 T f = \frac{1}{T} f=T1

则在一个周期 T T T内,周期信号 x [ n ] x\left[ n \right] x[n]可表示为
X [ k w ] = 1 T ∫ 0 T ∑ n = 0 N − 1 x ( t ) δ ( t − n T s ) e − j 2 π T k t d t X\left[ kw \right] = \frac{1} {T} \int_0^T {\sum \limits_{n=0}^{N-1} x(t) \delta (t-nT_s) } e^{-j\frac{2\pi}{T} kt}dt X[kw]=T10Tn=0N1x(t)δ(tnTs)ejT2πktdt
简化可得
X [ k w ] = ∑ n = 0 N − 1 1 T ∫ 0 T x ( t ) δ ( t − n T s ) e − j 2 π T k t d t = 1 T ∑ n = 0 N − 1 x ( n T s ) e − j 2 π T k n T s X\left[ kw \right] =\sum \limits_{n=0}^{N-1} { \frac{1} {T} \int_0^T x(t) \delta (t-nT_s) } e^{-j\frac{2\pi}{T} kt}dt \\[5pt] = \frac{1} {T} \sum \limits_{n=0}^{N-1} { x(nT_s) } e^{-j\frac{2\pi}{T} knT_s} X[kw]=n=0N1T10Tx(t)δ(tnTs)ejT2πktdt=T1n=0N1x(nTs)ejT2πknTs

考虑到信号周期 T T T与采样点周期 T s T_s Ts的关系 T = N T s T=N T_s T=NTs,则上式可表示为
X [ k w ] = 1 T ∑ n = 0 N − 1 x ( n T s ) e − j 2 π N k n X\left[ kw \right] = \frac{1} {T} \sum \limits_{n=0}^{N-1} { x(nT_s) } e^{-j\frac{2\pi}{N} kn} X[kw]=T1n=0N1x(nTs)ejN2πkn
则DFT可被简化为
X [ k ] = ∑ n = 0 N − 1 x [ n ] e − j 2 π N k n X\left[ k \right] = \sum \limits_{n=0}^{N-1} x \left[ n \right] e^{-j{\frac{2 \pi} {N}} kn} X[k]=n=0N1x[n]ejN2πkn

定义数字频率 w w w
f = 2 π f = 2 π T f = 2\pi f = \frac{2 \pi }{T} f=2πf=T2π
考虑到信号周期 T T T与采样点周期 T s T_s Ts的关系,则上式可表示为
w = 2 π f = 2 π T = 2 π N T s = 2 π f s N w = 2\pi f = \frac{2 \pi }{T}= \frac{2 \pi }{N T_s} = 2 \pi \frac{ f_s}{N} w=2πf=T2π=NTs2π=2πNfs
其中, f s / N f_s / N fs/N 可表示为频谱的分辨率。
则有采样信号的频率 w s i g = k w w_{sig}=kw wsig=kw
w s i g = k w = 2 π k f s N w_{sig} = kw = 2 \pi k \frac{ f_s}{N} wsig=kw=2πkNfs
其中 k k k表示频率分量的索引。

根据奈奎斯特采样定理,则采样信号的有效频率满足 w s i g ≤ 1 2 w s = π f s w_{sig} \le \frac{1}{2} w_{s}= \pi {f_s} wsig21ws=πfs约束。 接下来,对DFT输出的N点频率进行分析:

  • 2 π k f s N ≤ π f s 2 \pi k \frac{ f_s}{N} \le \pi {f_s} 2πkNfsπfs, 可得 k ≤ N / 2 k \le N/2 kN/2,此为前一半的DFT的输出,对应正频率
  • k > N / 2 k >N/2 k>N/2时,由于旋转因子 e − j 2 π N k n e^{-j\frac{2\pi}{N} kn} ejN2πkn的周期性,则有
    e − j 2 π N k n = e − j ( 2 π N k n − 2 n π ) = e − j 2 π k − N N n e^{-j\frac{2\pi}{N} kn} = e^{-j (\frac{2\pi}{N} kn - 2n \pi)} = e^{-j 2\pi \frac{k - N}{N} n } ejN2πkn=ej(N2πkn2)=ej2πNkNn
    其中 − N 2 ≤ k − N N ≤ 0 -\frac{N}{2} \le \frac{k - N}{N} \le 0 2NNkN0.因此后 N / 2 N/2 N/2个点对应负半轴的频率。
采样定理

首先需要指出的是,现实世界中的信号均为实信号,而实信号的傅里叶变换,其正频率和负频率部分的幅值相同,而相位是相反的。

根据采样定理,信号的最高频率不应超过采样频率的一半,则信号的频谱不应超过 f s / 2 f_s/2 fs/2, 因此实信号的傅里叶变换可以 f s / 2 f_s/2 fs/2进行分割,

傅里叶变换所表示的含义就是不同频率分量的加权和

Q3: 频谱画图时的注意事项

绘制单边谱

什么是傅里叶变换的单边谱呢?

绘制双边谱

什么是傅里叶的双边谱呢?

单边谱和双边谱的区别
fftshift函数的作用以及为什么需要该函数

为了将 [ N / 2 , N ] [N/2, N] [N/2,N]点对应的频谱搬移到 [ − N / 2 , 0 ] [-N/2, 0] [N/2,0]的位置,以展示真实的信号频谱。

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
C语言中实现傅里叶变换可以使用库函数或手动实现。 使用库函数: C语言中常用的傅里叶变换库函数是FFTW(Fastest Fourier Transform in the West),它是一款高效的开源库,可以实现多种傅里叶变换算法。使用FFTW库函数,可以方便地实现快速的傅里叶变换。 手动实现: 手动实现傅里叶变换需要了解离散傅里叶变换(DFT)的原理和算法。DFT的实现需要进行复数运算,可以使用C语言中的复数结构体和复数运算库函数。 下面是一个简单的例子,使用手动实现的方式计算离散傅里叶变换: ```c #include <stdio.h> #include <math.h> #define PI 3.14159265358979323846 // 复数结构体 typedef struct { double real; // 实部 double imag; // 虚部 } Complex; // 计算 e 的幂次方 Complex complex_pow(double e, int k) { Complex c; c.real = pow(e, k); c.imag = 0.0; return c; } // 计算两个复数的乘积 Complex complex_mul(Complex a, Complex b) { Complex c; c.real = a.real * b.real - a.imag * b.imag; c.imag = a.real * b.imag + a.imag * b.real; return c; } // 计算离散傅里叶变换 void dft(Complex x[], int n) { Complex X[n]; for (int k = 0; k < n; k++) { X[k].real = 0.0; X[k].imag = 0.0; for (int j = 0; j < n; j++) { Complex W = complex_pow(exp(-2.0 * PI * k / n), j); // 计算旋转因子 X[k] = complex_mul(X[k], x[j]); // 计算乘积并累加 X[k] = complex_mul(X[k], W); } } for (int k = 0; k < n; k++) { x[k] = X[k]; } } int main() { // 输入数据 int n = 8; Complex x[n]; for (int i = 0; i < n; i++) { scanf("%lf", &x[i].real); x[i].imag = 0.0; } // 计算离散傅里叶变换 dft(x, n); // 输出结果 for (int i = 0; i < n; i++) { printf("%.2f + %.2fi\n", x[i].real, x[i].imag); } return 0; } ``` 上述代码实现了一个简单的离散傅里叶变换,可以通过输入一组实数序列,输出其对应的傅里叶变换结果。需要注意的是,该实现并不是最优的,仅作为参考。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值