数字信号处理基础:采样定理、数字滤波器设计(FIR/IIR)、FFT原理与实现

各位同学,大家好。今天我们聊聊数字信号处理的基础。说实话,这部分内容在雷达系统里太重要了。你想想看,雷达回波从天线进来,经过模拟前端,最终都要变成数字信号才能处理。所以采样定理、滤波器设计、FFT,这三板斧必须得拿稳。

3.1 采样定理:别让信号“说谎”

采样定理,也叫奈奎斯特定理。说白了就是一句话:采样频率必须大于信号最高频率的两倍。为什么?因为低于这个频率,信号就会发生混叠,高频分量会伪装成低频信号混进来。

我在项目中遇到过一件事。有一次调试某型机载雷达,回波数据里总出现一个莫名其妙的低频分量。查了半天,发现是AD采样率设置低了,目标的多普勒频率刚好超过了采样率的一半。嗯,这就是典型的混叠。后来加了抗混叠滤波器,问题才解决。

避坑指南: 我曾经在实验室里偷懒,觉得信号频率不高,采样率随便设了个值。结果分析出来的频谱全是假的。记住:采样率至少留20%的余量,别卡着边界。

采样定理的数学表达很简单:

fs ≥ 2 * fmax

其中fs是采样频率,fmax是信号最高频率。实际工程中,我建议取fs = (2.5 ~ 5) * fmax,这样后续处理更从容。

3.2 数字滤波器设计:FIR与IIR的选择

滤波器是雷达信号处理的看家本领。我们主要用两种:FIR和IIR。很多人纠结选哪个,我直接说结论:

特性 FIR滤波器 IIR滤波器
相位特性 严格线性相位 非线性相位
稳定性 绝对稳定 可能不稳定
计算量 较大 较小
设计难度 简单 较复杂

我个人习惯:在雷达脉冲压缩、MTI等对相位敏感的场合,必须用FIR。如果只是做简单的带通滤波,对相位没要求,IIR更省资源。

3.2.1 FIR滤波器设计实战

设计FIR滤波器,最常用的是窗函数法。我给你们看一段MATLAB代码,这是我当年做项目时常用的模板:

% FIR低通滤波器设计
fs = 100e6;      % 采样率 100MHz
fc = 10e6;       % 截止频率 10MHz
N = 64;          % 滤波器阶数

% 汉明窗设计
b = fir1(N, fc/(fs/2), 'low', hamming(N+1));

% 查看频率响应
freqz(b, 1, 1024, fs);

这里要注意:阶数N越大,过渡带越窄,但计算量也越大。我一般取N = 4~8倍的过渡带宽度倒数,具体看系统资源。

小技巧: 设计带通滤波器时,可以用fir1函数指定频率向量。比如设计一个10MHz到20MHz的带通:b = fir1(N, [10 20]/(fs/2), 'bandpass');

3.2.2 IIR滤波器设计要点

IIR滤波器设计,我推荐用巴特沃斯或切比雪夫型。巴特沃斯通带最平坦,切比雪夫过渡带更陡。怎么选?看需求。

举个例子,设计一个4阶巴特沃斯低通:

% IIR低通滤波器设计
fs = 100e6;
fc = 10e6;
n = 4;  % 阶数

[b, a] = butter(n, fc/(fs/2), 'low');

% 查看频率响应
freqz(b, a, 1024, fs);

注意:IIR滤波器有反馈,搞不好会发散。我曾经在FPGA上实现IIR滤波器时,因为系数量化精度不够,滤波器直接自激了。所以,IIR的系数一定要用双精度或者定点数仔细量化。

3.3 FFT原理与实现:从时域到频域的桥梁

FFT是雷达信号处理的灵魂。没有FFT,我们根本看不到目标的距离和速度信息。FFT的本质就是快速计算DFT,把时域信号变换到频域。

DFT的公式大家应该都见过:

X(k) = Σ x(n) * e^(-j*2π*k*n/N)

直接算这个公式,复杂度是O(N²)。FFT利用旋转因子的对称性和周期性,把复杂度降到O(N log₂N)。

3.3.1 基2时间抽取FFT

最常用的FFT算法是基2时间抽取法。它的核心思想是分治:把N点序列分成奇偶两部分,分别做FFT,再合并。

我给你们画个简单的流程图(用文字描述):

  1. 输入序列按位倒序重排
  2. 进行log₂N级蝶形运算
  3. 每级有N/2个蝶形单元
  4. 旋转因子W_N^k逐级变化

代码实现(C语言风格):

void fft(complex* x, int N) {
    // 位倒序
    for (int i = 0; i < N; i++) {
        int j = bit_reverse(i, log2(N));
        if (i < j) swap(&x[i], &x[j]);
    }
    
    // 蝶形运算
    for (int len = 2; len <= N; len <<= 1) {
        complex w = exp(-j*2*PI/len);
        for (int i = 0; i < N; i += len) {
            complex wk = 1;
            for (int k = 0; k < len/2; k++) {
                complex u = x[i+k];
                complex v = x[i+k+len/2] * wk;
                x[i+k] = u + v;
                x[i+k+len/2] = u - v;
                wk *= w;
            }
        }
    }
}
重点: 实际工程中,FFT的点数N必须是2的整数次幂。如果不是,需要补零到下一个2的幂。补零还能提高频率分辨率,但不会增加真实信息量。

3.3.2 FFT在雷达中的应用

在机载雷达里,FFT主要干三件事:

  • 脉冲压缩: 对发射信号和回波做FFT,频域相乘再IFFT,得到压缩后的脉冲
  • MTI/MTD: 对多个脉冲做FFT,提取多普勒频率,区分动目标和静目标
  • 距离-多普勒图: 二维FFT生成距离-速度二维图像

我记得有一次做地面动目标检测,用128点FFT做多普勒处理,结果发现慢速目标被地杂波淹没了。后来把FFT点数增加到256点,频率分辨率提高了一倍,目标就露出来了。所以,FFT点数不是越大越好,但太小了肯定不行。

注意: FFT的频谱泄露问题。如果信号频率不是FFT频率分辨率的整数倍,能量会泄漏到相邻频点。解决办法是加窗,比如汉宁窗、布莱克曼窗。我一般用汉宁窗,效果比较均衡。

3.4 总结与工程建议

好了,今天的内容就这些。我最后给大家几个工程建议:

  1. 采样率一定要留余量,别省那点资源
  2. FIR滤波器优先考虑,除非资源紧张才用IIR
  3. FFT点数选2的幂,不够就补零
  4. 加窗处理不能省,否则频谱分析会出问题

这些基础打牢了,后面讲脉冲压缩、MTI、SAR成像,你们才能跟得上。有什么问题,咱们下节课再聊。

课后练习: 用MATLAB设计一个32阶FIR带通滤波器,中心频率5MHz,带宽2MHz,采样率50MHz。画出频率响应,看看过渡带有多宽。

公众号:蓝海资料掘金营,微信deep3321