【DSP】谱分析实践中的问题分析

目录

一、对离散信号进行FFT后的结果的组成分析

1、直流分量

2、正频率部分

3、负频率部分

4、总结

二、谱分析中的直流分量和趋势项

1、直流分量

2、趋势项

3、去除直流分量和趋势项对谱分析的影响

三、频谱分析中的混叠现象、栅栏现象、泄露现象

1、混叠现象(Aliasing)

2、栅栏现象(Picket Fence Effect)

3、泄露现象(Spectral Leakage)

4、为什么同样是矩形窗截断,有时会发生泄露,有时不会?

四、实际情况中fft()后的幅值的计算

1、没补0时

2、补0时

(1)FFT 的定义

(2)幅值的计算

(3)为什么归一化不除以 L

五、fftshift函数和ifftshift函数

1、fftshift 函数

2、ifftshift 函数

3、示例


一、对离散信号进行FFT后的结果的组成分析

        假设离散数据序列长度为 N(通常记为 x[0],x[1],…,x[N−1],FFT结果对应为 X_1, X_2, \dots, X_N),其FFT结果中的各个分量对应的频率解释如下:

1、直流分量

  • 直流分量对应零频率成分,即信号的平均值。

  • 在FFT结果中,X_1(即索引0对应的那一项,如果我们按数学上0-index来理解,但在1-index表述时,就是第一个分量)就是直流分量。

2、正频率部分

  • 对于正频率:若 N 为偶数,则从 X_2​ 到 X_{N/2+1}​ 分别对应正频率成分,其中:

    • X_2 对应第一个正频率(最低正频率),

    • 随着指数增加,正频率逐渐增大,

    • X_{N/2+1} 对应的频率值正好是奈奎斯特频率(即采样频率的一半)。

  • 如果 N 为奇数,则正频率部分一般从 X_2​ 到 X_{(N+1)/2} 对应正频率,其频率分布同样是从最低正频率逐渐增加到接近采样率的一半。

  • 变换趋势:
    正频率分量的频率值与其FFT索引成正比,即频率 f_k = k \cdot \Delta f(其中 k 为正频率部分的索引,从1开始计数,实际对应数学上 k=1,2,\dots),频率随着 k 的增大而线性增加。

3、负频率部分

  • 对于负频率:当 N 为偶数时,FFT结果中剩下的部分 X_{N/2+2}​ 到 X_N​ 对应的实际上是负频率分量。负频率的排列顺序是从最低负频率(也就是频率值最负的那部分)到接近0(负方向)的顺序排列:

    • 例如,X_N​(或数学上对应索引 −1 )对应的负频率最接近0,

    • X_{N/2+2} 对应的是负频率中绝对值最大的那一个(接近-奈奎斯特频率)。

  • 如果 N 为奇数,则负频率部分从 X_{(N+3)/2}​ 到 X_N​ 依次排列,其频率值从接近-采样率的一半到接近0。

  • 变换趋势:
    对应负频率的分量,频率值也是与索引呈线性变化,但这里的频率值是负数,且随着索引从 X_{N/2+2}​ 到 X_N​ 增加,频率值逐渐“上升”(即变得不那么负),直至在 X_N​ 附近接近零。

4、总结

  • 直流分量:

    • X_1​(FFT结果中的第一个分量,对应0 Hz)。

  • 正频率分量:

    • 一般从 X_2​ 开始到 X_{N/2+1}​(若 N 为偶数),频率从最低正频率逐渐增加到奈奎斯特频率。

    • 正频率随索引增加呈线性上升趋势。

  • 负频率分量:

    • 对应 X_{N/2+2}​ 到 X_N​ 的部分(若 N 为偶数),其频率为负,且按索引增加,频率值逐渐“上升”到接近0,即从最负的频率逐步减小绝对值。

二、谱分析中的直流分量和趋势项

在数字信号处理(DSP)中,进行谱分析前先消除直流分量和趋势项是十分关键的。

1、直流分量

定义与特性:
直流分量指信号中不随时间变化的恒定成分,也就是信号的平均值。数学上,若有离散信号 x[n] ,其直流分量可以定义为

                                                        DC = \frac{1}{N}\sum_{n=0}^{N-1} x[n]

其中 N 是信号的总点数。

对谱分析的影响:

  • 谱泄露: 如果信号中存在直流分量,频谱图上往往会在0 Hz处产生一个尖锐的直流峰值,这个峰值可能掩盖低频部分的其他有用信息。

  • 非对称性和不平稳性: 直流分量使得信号的均值偏离0,这可能导致后续处理(例如FFT)中的数值不稳定或误差累积。

  • 滤波器设计: 一些滤波器(如高通滤波器)的截止频率设计时需要考虑直流分量的影响,否则容易出现直流漂移问题。

消除方法:
最简单的办法是将信号的平均值减去,即

                        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​           \tilde{x}[n] = x[n] - DC

这样处理后,信号的平均值变为零,便于后续的频谱分析和滤波处理。

2、趋势项

定义与特性:
        趋势项是指信号中随时间缓慢变化的部分,通常表现为线性或多项式变化。例如,一个信号可以表示为:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        x[n] = DC + T[n] + s[n]

其中 T[n] 是趋势项(如线性趋势 an + b ),而 s[n] 是剩余的振荡或随机成分。

对谱分析的影响:

  • 低频成分失真: 趋势项主要集中在低频区域,如果不去除,会在频谱分析中导致低频成分的能量被错误估计,甚至引入虚假的低频成分。

  • 谱分辨率降低: 趋势项的存在会使信号在时域上呈现较长周期的变化,从而在频域上拉宽频谱的主瓣,降低频谱分辨率。

  • 窗函数效应: 在使用窗函数进行FFT时,趋势项可能导致窗函数两端不连续,从而引起额外的谱泄露现象。

消除方法:

  • 多项式拟合: 可以利用多项式拟合方法估计趋势项,然后将其从原始信号中减去。常见的是使用线性拟合(若趋势是线性的)或高阶多项式拟合。

  • 差分法: 对信号进行差分运算可以有效抑制缓慢变化的趋势项,不过需要注意差分可能引入高频噪声,需要后续平滑处理。

  • 高通滤波: 设计合适的高通滤波器也可以有效滤除低频趋势项,但滤波器参数需要精心设计以免削弱信号中有用的低频信息。

3、去除直流分量和趋势项对谱分析的影响

        在谱分析中,直流分量和趋势项虽然属于低频信息,但它们往往不代表信号的主要振荡或周期性特征,而可能只是背景偏移或缓慢变化的干扰因素

为什么去除它们通常是有益的:

  • 改善信号稳定性:
    直流分量(即平均值)和趋势项会使信号整体偏移或者呈现非平稳性,这会导致频谱中在0 Hz及低频段出现异常高的能量,掩盖实际的振荡特性。去除后能使信号均值归零,更符合大多数谱分析方法(例如FFT)的假设条件

  • 降低谱泄露:
    当信号中存在明显的直流分量和趋势项时,采用有限长度的窗口进行FFT时,会引入截断误差,使得直流和趋势项的能量泄露到其他频率。这样不仅低频部分会出现扩散现象,而且可能使得真正感兴趣的低频信号也难以分辨。去除直流和趋势后,窗口函数能够更好地限制频谱泄露,使得频谱分布更清晰。

  • 保留关键信息:
    在实际应用中,我们往往对信号中的振荡部分、周期性成分或其他非平稳特性更感兴趣。直流分量和趋势项通常代表信号的总体偏移或缓慢变化,而这些信息在许多情况下并不是我们主要分析的目标。如果低频部分本身就是信号的重要内容,则应谨慎处理,选择合适的方法去除趋势而非完全丢弃。

  • 实际处理方法:
    常用的处理方法包括减去平均值(消除直流分量)和多项式拟合去除趋势。这样做能够保留信号中相对较快变化的部分,而使频谱分析更聚焦于实际变化频率。需要注意的是,若信号中低频成分确实包含重要信息,则可以考虑部分保留或采用其他方法进行补偿。

  • 低频信息是否丢失问题
    需要注意的是,去除直流和趋势项确实会使得原始信号中某些低频信息被“剔除”。但是,这里的“低频信息”通常是指那些不具有实际周期性或振荡意义的成分。如果真正关心信号中某个低频振荡(例如,某种缓慢周期变化),则在处理时应谨慎,可能需要使用其他方法(例如分离趋势与振荡成分)来保留有意义的低频特征。因此,是否去除直流和趋势,取决于我们分析的目标和信号本身的特性。

三、频谱分析中的混叠现象、栅栏现象、泄露现象

1、混叠现象(Aliasing)

定义:
        混叠现象是指在采样过程中,当采样频率不足以满足奈奎斯特采样定理时,高于奈奎斯特频率的信号成分会“折叠”到低频区域,导致原始信号的频谱发生重叠,从而使得不同频率成分混合在一起。

形成原因:

  • 根据奈奎斯特定理,采样频率 f_s​ 必须大于信号最高频率的两倍。如果信号中包含的频率超过 f_s/2(奈奎斯特频率),就会发生混叠。

  • 例如,一个频率为 f 的正弦信号,如果 f > f_s/2,其采样后的频率会被误认为是 f_s - f 或其他等效低频,导致频谱混淆。

影响:
混叠会导致频谱分析结果失真,实际高频信息被错误地映射到低频,破坏了频谱的真实结构。

2、栅栏现象(Picket Fence Effect)

定义:
        栅栏现象(或称“栅栏效应”)指的是由于离散傅里叶变换(DFT)只能在有限的频率点上进行采样,导致实际信号中的谱峰如果不正好落在这些离散频率上时,其能量只能被部分捕获,从而造成频谱估计上的误差或“缝隙”现象。

形成原因:

  • DFT将连续的频率域离散化为若干个点,这些点间隔为 \Delta f = f_s/L,其中 L 是采样点数。

  • 当信号中的一个正弦分量的实际频率并非离散频率网格上的点时,其能量在DFT中会分散在相邻的几个频率点上,而不是集中在单个点上,这就产生了所谓的“栅栏”现象。

  • 此现象在某种意义上影响了频谱的分辨率,使得谱峰可能看起来“被分割”或存在偏移。

影响:

  • 栅栏现象会使得谱峰的最大值低于实际值,且频率估计存在偏差。

  • 尤其在对幅值要求精确的应用中(如谐波分析),会引入估计误差。

解决方法:

  • 序列后补0

3、泄露现象(Spectral Leakage)

定义:
        泄露现象是指由于对无限长信号进行有限长度截断(窗函数操作)时,截断操作相当于在时域上与一个窗函数相乘,而窗函数的频谱具有旁瓣,从而导致能量从信号的主频成分泄露到其他频率。

形成原因:

  • 在实际中我们只能对有限长的信号进行DFT,这等价于用一个矩形窗对信号进行截断。

  • 矩形窗的频谱为 sinc 函数,其旁瓣(sidelobes)虽然比主瓣低,但并非为零,因此会引起频谱泄露。

  • 如果信号频率恰好与DFT的离散频率点对齐(即周期性采样满足整数周期),则截断不会引起泄露,因为窗函数与信号匹配得较好;

  • 反之,如果信号频率和采样点网格不匹配,能量将扩散到其它频率点上,造成泄露。

影响:

  • 泄露会使得实际频谱中不该出现的频率点上出现非零幅值,降低频谱分辨率。

  • 对于具有很高动态范围的信号,泄露现象可能使得低幅值的频率成分被高旁瓣淹没,导致误判。

解决方法:

        为了防止泄漏,对于单频信号可以调整采样频率使之构成整周期采样(例如在电力监测设备中,有的会用锁相技术跟踪信号频率以调整采样频率),但大多数实际信号处理中的信号不是单频(或单频十谐波),而是多频率的,所以泄漏是难免的在有泄漏的情形中只能想方设法减小泄漏的影响,比如利用将在2.2.8小节中讨论的窗函数。虽然上述已在截断的讨论中加了矩形窗函数,但矩形窗函数的泄漏是最大的,还有其他窗函数能更好地减少泄漏。

4、为什么同样是矩形窗截断,有时会发生泄露,有时不会?

【案例2.9】同样详细举例分析了对齐情况和不对齐情况的可视化效果。

        虽然截断方法都是采用矩形窗,但是否发生泄露与信号的频率与窗函数频率网格的匹配程度密切相关:

  1. 频率对齐情况:

    • 对齐情况(无泄露):
      当信号的周期性正好满足采样窗长,即信号的频率分量在DFT的离散频率点上有严格对齐(例如,信号周期正好是采样窗口内的整数倍周期),此时矩形窗截断不会引起能量扩散。结果,能量集中在一个频率点上,旁瓣理论上为零(实际计算中可能因有限精度存在极小数值)。

    • 不对齐情况(发生泄露):
      如果信号频率不落在DFT离散频率点上,那么截断后相当于信号与矩形窗相乘,其频谱相当于信号谱与矩形窗谱(sinc函数)的卷积,导致信号的能量扩散到邻近频率点,从而产生泄露。

  2. 窗长与信号周期的关系:

    • 当采样窗内包含完整的周期(整数倍周期),矩形窗的截断边界不会在信号不连续点上引入突变,因此其频谱不会出现明显的旁瓣能量泄露。

    • 当采样窗中包含不完整的周期或信号末尾截断产生不连续时,突变引起的频谱扩展更明显,旁瓣能量更大,从而出现更严重的泄露。

  3. 频谱分辨率:

    • 采样点数 L 决定了频率分辨率 \Delta f = f_s/L 。较高的分辨率可以更细致地捕捉信号频谱结构,但也更容易暴露出泄露现象。

    • 在某些应用中,可以通过调整窗长或使用其他窗函数(如汉宁窗、汉明窗等)来减小泄露,但这些方法往往是用以折衷分辨率与泄露程度。

四、实际情况中fft()后的幅值的计算

1、没补0时

        幅值归一化主要是为了确保经过 FFT 得到的频谱幅值能正确反映原始信号的真实幅值。

大多数 FFT 实现(如 MATLAB 或 NumPy 中的 FFT)默认在正变换时不做归一化,而在逆变换时会除以采样点数 N。如果需要在正变换后获得正确幅值,可以在计算 FFT 后手动归一化:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        X_{\text{norm}}[k] = \frac{2}{N}*X[k]

其中 N 是信号的原始长度。乘2的原因是一般只考虑正频率部分。

2、补0时

如果进行了零填充(比如补零到 M 点),则归一化因子仍然为 N

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        X_{\text{norm}}[k] = \frac{2}{N}*X_z[k]

例子:

设原始信号为

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​                x[0], x[1], \dots, x[n-1]

在后面补上 2n 个零后,总序列长度为

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​                    L = n + 2n = 3n

(1)FFT 的定义

对补零后的信号,定义其离散傅里叶变换为

        ​​​​​​​        ​​​​​​​        ​​​​​​​              X[k] = \sum_{m=0}^{L-1} y[m]\, e^{-j\frac{2\pi}{L} k m}, \quad k = 0,1,\dots,L-1

其中

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​            ​​​​​​​       y[m] = \begin{cases} x[m], & 0 \le m \le n-1, \\ 0, & n \le m \le 3n-1. \end{cases}

由于后 2n 个样本全为 0,上式实际上只对 m=0,1,\dots,n-1 有贡献,即

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​          ​​​​​​​            X[k] = \sum_{m=0}^{n-1} x[m]\, e^{-j\frac{2\pi}{3n} k m}

(2)幅值的计算

通常,计算 FFT 后的幅值(或称振幅谱)就是取复数结果的模:

                                                                    幅值(k)=∣X[k]∣

但在实际应用中,为了恢复信号的实际幅值(尤其是当信号为实数且我们只关注正频率部分时),常常需要做归一化和修正。假设原始信号通过 n 点 FFT(不补零)后,其正频率幅值计算常写为

        ​​​​​​​        ​​​​​​​        ​​​​​​​           ​​​​​​​          A_{\text{}}[k] = \frac{2}{n}|X_{\text{}}[k]|, \quad k=1,2,\dots,\frac{n}{2}-1

对于直流分量和奈奎斯特分量则不乘 2)。

而在补零后的情况,虽然 FFT 长度变成 L=3n 了,但信号信息依然只来自前 n 个点,所以为了让幅值保持与原信号一致,归一化因子仍然应基于 n  而不是  L 。因此,一般写作

        ​​​​​​​        ​​​​​​​        ​​​​​​​               A_{\text{zp}}[k] = \frac{2}{n}\, |X[k]|,\quad k=1,2,\dots,(对应正频率范围)

直流分量(k=0 )和最高频率分量按情况处理,不乘 2。

(3)为什么归一化不除以 L

补零的作用在于提高频谱分辨率,使得频率坐标更细,但补零部分不贡献能量。信号的能量和幅值是由那 n 个非零样本决定的,因此归一化因子仍应采用 n 来保证:

  • 时域能量:\sum_{m=0}^{n-1} |x[m]|^2

  • 频域能量:\frac{1}{n}\sum_{k=0}^{n-1} |X_{\text{ }}[k]|^2,其中X_{\text{ }}[k] 是没补零时的X_{\text{ }}[k]

对于补零后的信号,Parseval 定理写为

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        \sum_{m=0}^{3n-1} |y[m]|^2 = \frac{1}{3n} \sum_{k=0}^{3n-1} |X[k]|^2

但由于 \sum_{m=n}^{3n-1} |y[m]|^2 = 0,实际能量还是

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​          \sum_{m=0}^{n-1} |x[m]|^2

为了让频域幅值反映原始信号的真实幅值,我们在归一化时仍以 n 为基准,而不是 L=3n 。

五、fftshift函数和ifftshift函数

        在 Matlab 中,fftshiftifftshift 主要用于对离散傅里叶变换(DFT)的输出进行“中心化”处理,使得频谱的直流分量(零频率分量)出现在数组中心位置,而非默认的数组开头。

        在处理信号时,常常把信号FFT后取正频率部分,对正频率部分进行各种处理。在处理结果后,一方面要按 2.1.5 小节中所述的方法,补足负频率部分,另一方面还要把频谱的频率按这样的顺序排列:0,  Δf,  …,  fs/2-Δf,   -fs/2,   -fs/2+Δf  , …,  -Δf,然后再进行IDFT。

1、fftshift 函数

  • 主要作用:
    fftshift 用于将频域数据重新排列,将零频率分量移到数组中心位置。这对于可视化或进一步处理频谱数据非常有用,因为直观上可以看到负频率和正频率对称分布的情况。

  • 工作原理:
    当你对信号进行 FFT 变换后,结果数组中低频(包括直流分量)通常位于数组的前半部分,高频信息位于后半部分。fftshift 的作用就是交换数组的前后部分。

    • 偶数长度数组: 后半部分大小转到前半部分。

    • 奇数长度数组: 数组的中间元素保持,中间元素以后的元素调到最前边。

  • 使用场景:
    常用于频谱的显示和分析。例如,当你使用 fft 得到频谱后,通过 fftshift 将零频率移到中间,便于观察正负频率成分的分布。

2、ifftshift 函数

  • 主要作用:
    ifftshift 是 fftshift 的逆操作,用于将经过 fftshift 处理的数据恢复到原始排列状态。
    这在进行逆傅里叶变换(ifft)前非常重要,因为 ifft 函数期望输入的频谱数据是按照 Matlab 默认的 FFT 输出顺序排列的。

  • 工作原理:
    ifftshift 会将数组重新“反转”,即把中心化的数据还原回零频率分量在数组开头的排列方式。

    • 偶数长度数组: 后半部分大小转到前半部分。

    • 奇数长度数组: 中间元素及中间元素以后的元素调到最前边。

  • 使用场景:
    当你对经过 fftshift 调整后的频谱数据进行处理后(比如滤波或频谱操作),在使用 ifft 进行逆变换前,通常需要先调用 ifftshift 将数据恢复原状。

3、示例

当N为偶数和奇数时,fftshift函数和ifftshift函数转移样点的个数是不一样的。

        先设N为偶数,N=16,原序列排列为

                                1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16

        把该序列经fftshift,得

                                9   10  11  12  13  14  15  16   1   2   3   4   5   6   7   8

        把该序列经ifftshift,得

                                9   10  11  12  13  14  15  16   1   2   3   4   5   6   7   8

        从以上两个结果可以看出,当N为偶数时,fftshift和ifftshift函数转移样点后的结果是相同的,都是把序列右侧N/2个样点转移到序列的左侧。

再设N为奇数,N=17,原序列排列为

                                1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17

        把该序列经fftshift,得

                                10  11  12  13  14  15  16  17   1   2   3   4   5   6   7   8   9

        把该序列经ifftshift,得

                                9   10  11  12  13  14  15  16  17   1   2   3   4   5   6   7   8

        从以上两个结果可以看出,当N为奇数时,fftshift 和ifftshift函数转移样点的结果是不相同的。在执行 fftshift 函数时,把(N-1)/2个样点转移到序列的左侧;而在执行ifftshift 函数时,把(N+1)/2个样点转移到序列的左侧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值