从零入门级FMCW
雷达测距教程,整合技术深度与教学递进性:
- 本文的内容全是用
ds
整理过后的,除了引用框内(比如这段), 是我自己非加不可,不加浑身难受的大白话.- ds确实方便,从此很大程度上解决了我表达能力欠缺的问题.
- 但是, ds有时候会胡言乱语,前后矛盾, 大部分我都是保留我确定" 正确 "的内容,还有部分我不确定的内容,还有一些我完全不知道是否正确的内容,所以如果发现有错,请立刻评论回复我
(*/ω\*)
本教程只涉及浅显的通用知识,有些地方我会故意讲错(并非故意), 因为简单理解方便入门使用.同时免责声明,涉及都是公开内容,ds的胡言乱语.
参考博客:
- https://blog.youkuaiyun.com/xhtchina/article/details/117228943
- https://ratel.blog.youkuaiyun.com/article/details/117228943
- https://blog.youkuaiyun.com/caigen0001/article/details/108815569
- https://blog.youkuaiyun.com/CUGzhazhadong/article/details/119541284
- https://blog.youkuaiyun.com/qq_39452512/article/details/116405162
- https://blog.youkuaiyun.com/yaozekun/article/details/132889415
- https://blog.youkuaiyun.com/yhcwjh/article/details/117675034
- https://blog.youkuaiyun.com/slyywd/article/details/143687660
参考论文
- 刁攀. 24G调频连续波雷达收发前端的设计[D]. 四川:电子科技大学,2020.
- 杨博. 车载防撞雷达线性调频源的研究与设计[D]. 西安电子科技大学,2011.
FMCW雷达测距原理与实现全解
适合读者:电子工程/雷达技术入门者 所需基础:模拟电路、信号与系统
目录
第1章 雷达测距基本原理
1.1 物理量转换的测量学本质
雷达测距的最终其实就是测频率, 类比温度计,压力计, 最终其实就是测形变量.
测量系统的核心在于物理量转换链的设计:
- 温度测量范例
温度变化 → 汞体积变化 → 毛细管长度变化(线性关系式: Δ L = α ⋅ Δ T ΔL=α·ΔT ΔL=α⋅ΔT) - 压力测量原理
压力荷载 → 弹性体形变 → 应变片阻值变化( Δ R / R = K ⋅ ε ΔR/R=K·ε ΔR/R=K⋅ε)
1.2 雷达测距的双程时延原理
雷达测距就是通过
电磁波反射, 计算运动时间得到距离. 也就是蝙蝠
探路!!!夜魔侠
扫描坏人!!!
基础公式推导:
当发射信号到达目标经反射返回时:
Δ
t
=
2
R
c
Δt = \frac{2R}{c}
Δt=c2R
其中R为目标距离,c为光速(3×10^8 m/s)
关键实现路径:
发射信号 → 目标反射 → 接收信号 → 时延测量 → 距离解算
1.3 FMCW雷达的频率映射机制
注意
FMCW
的思路, 是发射一个变动频率的信号, 在时域
就是一个忽窄忽疏的正弦波, 在频域
就是一个斜率和截距固定的一元一次直线.
线性调频连续波(FMCW) 特性:
- 发射频率随时间线性变化: f T X ( t ) = f 0 + B T t f_{TX}(t)=f_0+\frac{B}{T}t fTX(t)=f0+TBt
- 接收频率取决于放射距离: f R X ( t ) = f T X ( t + Δ t ) f_{RX}(t) = f_{TX}(t+Δt ) fRX(t)=fTX(t+Δt)
- 差拍频率生成原理: f b = ∣ f T X − f R X ∣ = 2 B R c T f_b=|f_{TX}-f_{RX}|=\frac{2BR}{cT} fb=∣fTX−fRX∣=cT2BR
其中B为调频带宽,T为调频周期 ,f0 为起始频率,fb 为差频频率,
在FMCW雷达系统中,差频频率(fb)和中频频率(IF frequency)本质上是同一个概念的不同表述
1.4 理想条件下的约束分析
注意,本文只讨论静止不动的发射端和反射物,简化模型,方便理解.
-
静止目标假设
- 忽略多普勒频移影响
- 实际系统需引入速度补偿算法
-
自由空间传播模型
- 路径损耗
- 未考虑多径效应与大气衰减
1.5 FMCW雷达工作原理示意图
我弄的图还是欠缺直观性, 从博客笔记借张图用一下: FMCW雷达原理
以下是上述公式的示意图,可以看到静止目标时,发射和接收的差频频率只有交叉处会变化.中间调频过程是不变的. 如果时间差越大的话,差频频率就越大.
import numpy as np
from scipy.integrate import cumtrapz
import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec
from matplotlib.patches import Rectangle, Circle
import matplotlib as mpl
# 全局字体和符号设置
plt.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
mpl.rcParams['text.usetex'] = False # 避免与中文冲突
# 参数设置
f0 = 77e9 # 起始频率 77GHz
B = 4e9 # 带宽 4GHz (77-81GHz)
T = 50e-6 # 调频周期 50μs
c = 3e8 # 光速
R = 150 # 目标距离 150米
delta_t = 2*R/c # 往返时间延迟
# 时间轴(增加采样点数)
num_points = int(10 * B * 2*T) # 按带宽的10倍采样
t = np.linspace(0, 2*T, num_points) # 两个周期
# 1. 三角波频率调制(矢量化计算提高精度)
ramp_up = (t % T) < T/2
ramp_down = ~ramp_up
f_tx = np.zeros_like(t)
f_tx[ramp_up] = f0 + (B/(T/2)) * (t[ramp_up] % (T/2))
f_tx[ramp_down] = f0 + B - (B/(T/2)) * (t[ramp_down] % (T/2))
# 接收信号频率 (延迟delta_t)
t_delayed = t - delta_t
valid_rx = t_delayed >= 0 # 只处理已收到回波的情况
f_rx = np.full_like(t, f0) # 初始化为f0
ramp_up_rx = (t_delayed[valid_rx] % T) < T/2
ramp_down_rx = ~ramp_up_rx
f_rx[valid_rx] = np.where(
ramp_up_rx,
f0 + (B/(T/2)) * (t_delayed[valid_rx] % (T/2)),
f0 + B - (B/(T/2)) * (t_delayed[valid_rx] % (T/2))
)
# 差频信号
f_beat = np.abs(f_tx - f_rx)
# 2. 时域信号
A_tx = 1.0 # 发射信号幅度
A_rx = 0.3 # 接收信号幅度(衰减)
phase_tx = 2*np.pi * cumtrapz(f_tx, t, initial=0)# 替换原有相位计算部分(使用cumtrapz提高精度)
phase_rx = 2*np.pi * cumtrapz(f_rx, t, initial=0)
tx_wave = A_tx * np.sin(phase_tx)
rx_wave = A_rx * np.sin(phase_rx)
# 3. 创建图形(调整布局)
plt.figure(figsize=(12, 14))
gs = GridSpec(5, 1, height_ratios=[1, 1, 1, 1.5, 0.2]) # 增加间距
# 3.1 频率调制图
ax1 = plt.subplot(gs[0])
ax1.plot(t*1e6, f_tx/1e9, 'b', label='发射频率 $f_{TX}(t)$')
ax1.plot(t*1e6, f_rx/1e9, 'r', label='接收频率 $f_{RX}(t)$', alpha=0.7)
ax1.set_ylabel('频率 (GHz)', labelpad=10)
ax1.set_title('FMCW三角波频率调制 (77-81GHz)', pad=15)
ax1.legend(loc='upper right')
ax1.grid(True, linestyle='--', alpha=0.6)
# 3.2 差频信号
ax2 = plt.subplot(gs[1], sharex=ax1)
ax2.plot(t*1e6, f_beat/1e6, 'g')
ax2.set_ylabel('差频 (MHz)', labelpad=10)
ax2.set_title('差频信号 $f_b = |f_{TX} - f_{RX}|$', pad=15)
ax2.grid(True, linestyle='--', alpha=0.6)
# 3.3 时域信号(确保负号显示)
ax3 = plt.subplot(gs[2], sharex=ax1)
ax3.plot(t*1e6, tx_wave, 'b', label='发射信号')
ax3.plot(t*1e6, rx_wave, 'r', label='接收信号', alpha=0.7)
ax3.set_xlabel('时间 (μs)', labelpad=10)
ax3.set_ylabel('振幅', labelpad=10)
ax3.set_title('时域信号波形', pad=15)
ax3.legend(loc='upper right')
ax3.grid(True, linestyle='--', alpha=0.6)
# 3.4 简易雷达测距示意图
ax4 = plt.subplot(gs[3])
ax4.set_title('简易雷达测距示意图', y=0.9, pad=0) # 设置标题(自动调整位置防重叠) # y参数控制垂直位置
ax4.set_aspect('equal')
fixed_xlim = 30 # 固定显示范围为30米
ax4.set_xlim(0, fixed_xlim)
ax4.set_ylim(-5, 5)
ax4.axis('off')
# 调整目标位置显示比例
display_ratio = min(1, fixed_xlim/R) if R != 0 else 1
display_R = R * display_ratio
# 绘制雷达和目标
radar = Circle((0, 0), 1, color='blue', alpha=0.7)
target = Rectangle((display_R-0.5, -0.5), 1, 1, color='red', alpha=0.7)
ax4.add_patch(radar)
ax4.add_patch(target)
# 绘制波束(适配显示比例)
wave_x = np.linspace(0, display_R, 100)
wave_y = 0.3 * np.sin(10*wave_x/display_ratio) * np.exp(-0.1*wave_x/display_ratio)
ax4.plot(wave_x, wave_y, 'b--', alpha=0.5)
ax4.plot(wave_x, -wave_y, 'b--', alpha=0.5)
# 标注(自动调整位置)
ax4.text(0, -2, '雷达发射端', ha='center')
target_label_x = min(display_R, fixed_xlim-3) # 防止文字超出右边界
ax4.text(target_label_x, -2, f'目标 (距离={R}m)', ha='center')
arrow_length = min(display_R, fixed_xlim-1)
ax4.arrow(0, 1.5, arrow_length, 0, head_width=0.3, head_length=0.5, fc='k')
ax4.text(arrow_length/2, 2, f'延迟时间 Δt={delta_t*1e6:.2f}μs', ha='center')
# 主标题(调整位置避免重叠)
plt.suptitle('FMCW雷达工作原理示意图 (三角波调制)', y=0.98, fontsize=16)
plt.tight_layout(rect=[0, 0, 1, 0.96]) # 为suptitle留出空间
plt.subplots_adjust(hspace=0.5) # 增加子图间距
plt.show()
不够直观, 借一张别人的图, :
【FMCW毫米波雷达设计 】 — FMCW波形
上图中的
时域信号波形
不直观,换下面这部分代码调整一下参数, 可以直观理解. 信号从疏松到密集再到疏松的变量.
注意!! 这只是个大概示意,实际雷达运作不一定如此. 我猜的.
小知识: 雷达配置时, 采样点数可以类比为步进数~ 方便理解
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import cumtrapz
# 参数配置
start_freq = 77e9 # 77 GHz
peak_freq = 81e9 # 81 GHz
end_freq = 77e9 # 77 GHz
total_cycles = 100 # 总周期数
sample_rate = 1000 # 采样点/周期
# 参数配置 方便观察
if True:
start_freq = 10 # 10 Hz
peak_freq = 100 # 100 Hz
end_freq = 10 # 10 Hz
total_cycles = 20 # 总周期数
sample_rate = 1000 # 采样点/周期
# 频率变化函数(三角波型)
def frequency_profile(t, total_time):
"""频率从77GHz线性上升到81GHz再下降回77GHz"""
half_time = total_time / 2
return np.where(t < half_time,
start_freq + (peak_freq - start_freq) * t / half_time,
peak_freq - (peak_freq - end_freq) * (t - half_time) / half_time)
# 计算总时间(通过数值积分确定)
def calculate_total_time():
# 使用迭代法确定满足总周期数的时间长度
time_guess = total_cycles / start_freq # 初始猜测值
for _ in range(10): # 10次迭代足够收敛
t_temp = np.linspace(0, time_guess, 10000)
freq_temp = frequency_profile(t_temp, time_guess)
phase = cumtrapz(freq_temp, t_temp, initial=0)
actual_cycles = phase[-1] / (2*np.pi)
time_guess *= total_cycles / actual_cycles
return time_guess
total_time = calculate_total_time()
print(f"Total signal duration: {total_time*1e12:.2f} ps") # 显示皮秒级时长
# 生成时间序列
t = np.linspace(0, total_time, int(sample_rate * total_cycles))
freq = frequency_profile(t, total_time)
# 数值积分计算相位(比cumsum更精确)
phase = 2 * np.pi * cumtrapz(freq, t, initial=0)
signal = np.sin(phase)
# 绘图
plt.figure(figsize=(15, 6))
plt.plot(t*1e12, signal) # 时间轴显示为皮秒
plt.xlabel('Time (ps)', fontsize=12)
plt.ylabel('Amplitude', fontsize=12)
plt.title(f'77GHz → 81GHz → 77GHz Chirp Signal\n'
f'Total Duration: {total_time*1e12:.2f} ps | '
f'Actual Cycles: {phase[-1]/(2*np.pi):.2f}', fontsize=14)
# 添加频率标记
ax2 = plt.gca().twinx()
ax2.plot(t*1e12, freq/1e9, 'r--', alpha=0.5)
ax2.set_ylabel('Frequency (GHz)', color='r', fontsize=12)
ax2.tick_params(axis='y', colors='r')
plt.grid(True)
plt.tight_layout()
# 显示关键参数
print(f"Start frequency: {freq[0]/1e9:.2f} GHz")
print(f"Peak frequency: {np.max(freq)/1e9:.2f} GHz")
print(f"End frequency: {freq[-1]/1e9:.2f} GHz")
print(f"Actual cycles completed: {phase[-1]/(2*np.pi):.4f}")
plt.show()
1.6 毫米波雷达参数体系分析
(1) 典型工作频段配置
下面是一些 行业典型 (个人经验) 参数, 实际开发使用时根据 硬件 和 指标 需求决定.
注意!!! 有些资料会把锯齿波
和三角波
的调频周期(T)
定义为两倍关系,具体看上下文,不要搞混了.
本文一律按 1个锯齿波(上升沿) 为 1个调频周期 T.
雷达类型 | 基础频率范围 | 调频带宽 (B) | 调频周期 (T) |
---|---|---|---|
24 GHz雷达 | 24-24 GHz | 1 GHz | ≥5 ms |
77 GHz雷达 | 76-81 GHz | 4 GHz | ≥5 ms |
120 GHz雷达 | 119-124 GHz | 5 GHz | ≥5 ms |
(2) 关键参数约束关系
个人简易理解: (
我也不太懂)
周期太短, 变化率太大, 时钟树分频不了. 对硬件要求大. 周期太长, 信号能量变弱, 抗干扰能力降低. 也不利于测量运动目标.
带宽越大分辨率越高, 但硬件不支持, 一般会采用允许最大值.
① 调频周期(T)设计考量
- 短周期限制:基带滤波器阶数需求增加
- 长周期弊端:运动目标相位模糊风险增加
② 调频带宽(B)优化
距离分辨率理论极限:
Δ
R
=
c
2
B
(
c
=
3
×
1
0
8
m
/
s
)
\Delta R = \frac{c}{2B} \quad (c=3\times10^8 m/s)
ΔR=2Bc(c=3×108m/s)
理论最大分辨率
Δ
R
\Delta R
ΔR :
- 24 GHz: B=1 GHz →15 cm
- 77 GHz: B=4 GHz → 3.75 cm
- 120 GHz: B=5 GHz → 3 cm
硬件限制因素:
- 天线效率:限定宽频带工作
- 基带采样率:防频谱混叠
(3) 设计折衷策略
- 带宽优先:在硬件允许范围内最大化B值
- 周期优化:根据目标动态范围选择典型值
- 功率补偿:硬件或软件放大器
第2章 FMCW系统架构设计
我弄的图还是欠缺直观性, 从博客笔记借张图用一下: FMCW雷达原理
2.1 FMCW系统硬件流程图
一般流程如下, 目前市面有些模块是可以集成到一起, 也有些模块是只负责其中一部分, 需要几个模块组合使用.
2.2 全流程信号流明细
流程如果不能理解可以先死记, 上手后调几遍参数, 就自然而然明白了.
下面ds生成的清单, 有些可能是瞎编
的, 如果看不懂不用管它
模块 | 输入参数 | 输出信号 | 物理量单位 |
---|---|---|---|
FMCW波形生成器 | 调频起始频率 带宽 调频时间 | 线性斜坡电压 或 数字控制字 | V / Digital Code |
分数分频PLL | 参考频率 分频比 | VCO调谐电压 | V |
VCO压控振荡器 | 调谐电压 | 射频信号 | GHz |
环路滤波器 | VCO相位噪声谱 | 滤除高频噪声后的误差电压 | V |
功率放大器(PA) | 射频输入功率 | 放大输出功率 | dBm |
发射天线 | 射频电磁场能量 | 定向辐射电磁波 | dBm EIRP |
接收天线 | 反射回波 | 感应电压 | μV |
低噪声放大器(LNA) | 天线输入信号 | 放大信号 | mV |
微波混频器 | 接收信号 + LO信号 | 中频差拍信号 | MHz |
基带滤波器 | 宽带中频信号 | 带限滤波信号 | Vpp |
可变增益放大器(VGA) | 滤波后信号 | 动态调节信号 | V |
ADC转换器 | 模拟中频信号 | 数字采样数据 | Digital Code |
DSP处理单元 | 数字信号 | 目标距离值 | Meters |
2.3 专业术语增强解释 & 重要指标
这里我挑选认为重要的节点介绍一下, 其他没提及的自行ds一下.
注意!!! 下列各个内容也是重要检查对象, 是需要检查的检查项, 确保指标正常.
2.3.1 VCO(Voltage-Controlled Oscillator)压控振荡器
简单理解就是用来生成三角波的东西, 上面章节中看到三角波/锯齿波都是由它生成.
生成的方式是通过电压控制频率.一般vco模块手册会有关系图, 电压(x) / 频率(y) 的指标.
所以会有输出一个对应的三角波电压
. 可以对应上图中的# 1. 三角波频率调制
.
一般还会有一个输出频率的分频输出
用于检查调频线性度, 可以对应上图中的# 2. 时域信号
.
比如77~81GHz进行64分频(右移6位),然后再通过一个引脚输出,可以用仪器或主控检测.
定义:一种通过输入控制电压精确调节输出频率的主动电子振荡器
在FMCW雷达中的核心作用
- 线性调频生成
- 接收波形生成器的斜坡电压信号,输出频率随时间线性变化的射频信号(Chirp信号)
- 关键指标:调频线性度、相位噪声
- 本振信号提供
- 同时馈送至发射链(通过PA)和接收链(混频器LO端口),实现相干检测
- 频率敏捷性
- 支持自定义调频
2.3.2 环路滤波器(Loop Filter)
是VCO的一部分, 就是调频的输入电压前的滤波电路. 值得注意的是,
其实是输出电流, 通过环路滤波器后转换为电压. 我一开始时以为是: 电压→滤波→电压
定义:锁相环中的模拟/数字滤波电路,位于 相位检测器(PD) 和 压控振荡器(VCO) 之间,核心功能是:将相位误差电流信号转换为纯净的控制电压
在FMCW雷达中的核心作用
- 噪声抑制
- 滤除相位检测器的高频纹波(如参考时钟馈通)
- 典型指标:在1MHz偏移处衰减>40dB
- 动态响应控制
- 通过带宽( B W 3 d B BW_{3dB} BW3dB)设定锁定时间(如77GHz雷达要求<50μs)
- 抑制VCO的固有频率抖动(如±100ppm温漂)
- 稳定性保障
- 提供相位裕度(45°~60°为佳),避免PLL自激振荡
2.3.3 本振反馈机制 (LO Feedback)
在使用时,会需要将发射信号与接收信号进行混频, 简单点理解就是相减, 得到中频信号, 也就是目标频率.
如果关闭发射信号/关闭本振信号, 同时对着天空(无反射目标), 那接收输出的就是整个雷达硬件系统的底噪
,
这是也算是一个简易的检测指标.上面是我的个人理解,不知道对不对.
在FMCW雷达中的核心作用
-
存在LO反馈时:
- 混频器将接收信号(S_Rx)与发射本振信号(S_LO)进行相干混频,输出为包含目标距离信息的中频信号(IF),其频率与目标距离成正比
-
无LO反馈时:
- 接收信号无法与发射信号相干解调,混频器输出呈现宽带噪声,有效目标信息被淹没,导致测距功能失效
2.3.4 基带滤波器(Baseband Filter)& 增益放大器 (GA)
简单点理解就是最后的滤波器, 将目标频率以外的频率都过滤掉
同时也有放大作用, 将无效信号的放大倍数控制在-3dB
以下,-3dB
是一个重要观念, 这里不扩展了, 自行ds一下.
还有就是将输出的差分信号合并抬升, 到adc基准压的一半, 方便采样.
定义:位于信号链最后端的低通滤波器,用于提取有用基带信号并抑制高频噪声和混叠分量,重要指标为截止频率和采样率。
核心作用解析
- 抗混叠(ADC前)
- 抑制高频噪声折叠到基带(奈奎斯特准则)
案例:在100MHz采样系统中(最大分辨频率50MHz),40MHz低通滤波器可避免60MHz噪声混叠至40MHz以下
- 抑制高频噪声折叠到基带(奈奎斯特准则)
- 信道选择
- 在零中频接收机中提取目标信道
实现:将输出的差分信号抬升到(Vcc/2)中间电压
- 在零中频接收机中提取目标信道
- 噪声整形
- 配合Σ-Δ调制器将量化噪声推向高频
典型应用:Class-D功放的LC后级滤波器
- 配合Σ-Δ调制器将量化噪声推向高频
第3章 频率测量技术实现
3.1 数字处理流程
本章节主要是纯软件方面的算法介绍, 我不会贴出具体代码和实现过程, 请学会后自行实现.
3.2 预处理
采集到原始数据后, 对时域信号的处理.
我不想太过冗余的介绍, 毕竟要讲清楚的话就要长篇大论了, 请自行搜索相关内容.
本文只是ds简单介绍部分可以使用的步骤, 并非必须必要的, 而且不一定是对的, 请自行判断.
3.2.1 数字滤波器
滤波器类型 | 适用场景 | 设计要点 |
---|---|---|
FIR带通滤波器 | 需严格相位响应 | - 通带范围 - 窗函数法设计 |
IIR切比雪夫滤波器 | 高陡峭度需求 | - 纹波 - 级联二阶节实现稳定性 |
3.2.2 窗函数
窗函数 | 主瓣宽度 | 旁瓣衰减 | FMCW适用性 |
---|---|---|---|
汉宁窗 | 1.5× | -31dB | 常规场景(平衡分辨率与泄漏) |
平顶窗 | 3.8× | -70dB | 幅值精度优先(标定测试) |
布莱克曼 | 3.0× | -58dB | 强干扰抑制(多目标环境) |
注意事项:
- 窗长度应匹配FFT点数(N=2^14典型值)
- 加窗后需幅度补偿系数(如汉宁窗补偿√8/3)
3.2.3 消除直流分量
- 原理:直流分量通常表示信号的平均值,通过从信号中减去均值可消除直流偏移
- 特点:简单高效,适合静态信号。
- 缺点:若信号存在动态变化的基线漂移(如ECG信号),需结合其他方法。
3.2.4 抑制噪声分量
- 原理:利用噪声的随机性特征(均值为零且与信号不相关),通过多次采集相同条件下的信号并累加平均,提高信号的信噪比(SNR)
- 特点:简单直观,兼容性强(无需复杂滤波器设计)。
- 缺点:实时性受限,同步性要求高,破坏瞬态成分。
3.3 后处理
对处理后信号进行快速傅里叶变换, 得到频谱, 然后开始对频域信号的处理.
我不想太过冗余的介绍, 毕竟要讲清楚的话就要长篇大论了, 请自行搜索相关内容.
本文只是ds简单介绍部分可以使用的步骤, 并非必须必要的, 而且不一定是对的, 请自行判断.
3.3.1 数字滤波器(频域选择性截取)
- 原理:在频域直接截取目标信号对应的谱线,滤除带外噪声。截断范围可通过设置截止频率或频带阈值(如-3dB带宽)确定。
3.3.2 峰值补偿(频域幅值校正)
- 目的:校正因频谱泄露或非整周期采样(或硬件放大电路)导致的峰值衰减。
- 方法:
- 插值法:利用主瓣相邻谱线(如Hanning窗下的三点插值)估算真实幅值。
- 模型拟合:通过多项式或高斯函数拟合主瓣形态,精确提取峰值频率与幅值。
- 修正因子:基于窗函数能量损失计算补偿系数(如Hamming窗补偿因子为1.85)。
3.3.3 消除临界点(边界信号处理)
- 步骤:定位首个和末个能量低谷。剔除首尾非稳态区间,保留中间稳定段。
- 效果:抑制信号截断引入的虚假频率分量,提升频谱纯净度。
3.3.4 抑制噪声分量(对称频域差分)
- 原理:输入为复信号(如IQ正交信号),目标信号能量集中于单侧频谱(如正半轴),而噪声在正负半轴对称分布。利用对称性差分运算,抑制共模噪声并保留目标信号。
- 操作:分离频谱正负半轴分量,提取相同频点对的幅度差,执行差分运算。
- 优势:适用于低信噪比场景,可显著提升目标谱线的可辨识度。
3.4 评估信号质量
对频谱后处理完后, 就开始找有效最大谱线, 然后对谱线进行评估,
如果认为有效可靠就下一步, 否者换一根谱线判断或认为本次采集信号是无效的.
我不想太过冗余的介绍, 毕竟要讲清楚的话就要长篇大论了, 请自行搜索相关内容.
本文只是ds简单介绍部分可以使用的步骤, 并非必须必要的, 而且不一定是对的, 请自行判断.
3.4.1 信噪比(Signal-to-Noise Ratio, SNR)
- 原理:计算峰值处信号的功率与周围噪声的平均功率比值。
- 计算步骤:
- 标定最大峰值点,确定信号带宽(如3dB主瓣宽度)。
- 在信号主瓣外选择无显著分量的区域作为噪声基准,计算噪声均方根(RMS)。
- SNR = 10·log₁₀(峰值功率 / 噪声功率)。
- 优点:直观、计算简单,适合快速评估信号显著性。
- 缺点:噪声带选取需经验调整,可能因频谱泄露或非平坦噪声导致偏差。
- 计算步骤:
- 适用场景:初步信号筛选(如无线通信频点质量评估)。
3.4.2 主瓣旁瓣比(Main-Lobe to Side-Lobe Ratio, MLSR)
- 原理:对比主瓣峰值与最大旁瓣的幅值差,评估频谱泄漏对峰值的影响。
- 计算步骤:
- 定位主瓣峰值点。
- 寻找主瓣外第一旁瓣的最大幅值。
- MLSR (dB) = 主瓣峰值幅值 - 最大旁瓣幅值。
- 优点:量化频谱泄漏程度,对窗函数性能评价敏感。
- 缺点:不适用于无明确旁瓣的场景(如加矩形窗后的泄漏干扰)。
- 计算步骤:
- 适用场景:频谱纯度分析(如雷达脉冲压缩后的旁瓣抑制效果评估)。
3.4.3 峰值锐度(3dB带宽法)
- 原理:计算峰值衰减3dB时的频带宽度,越窄表示频率精度越高。
- 计算步骤:
- 确定峰值幅值的70.7%(即-3dB点)。
- 向左右两侧搜索首个小于该值的频点,计算二者频率差(Δf)。
- 带宽Δf越窄,峰值锐度越高。
- 优点:直接反映频率分辨能力,适用于窄带信号分析。
- 缺点:对多峰混叠或非对称主瓣可能失效。
- 计算步骤:
- 适用场景:机械振动频率特征提取(如轴承故障检测)。
3.4.4 谱线对称性检验
- 原理:真实信号的频谱主瓣通常对称,噪声或干扰可能表现出非对称特性。
- 计算步骤:
- 以主瓣中心频点为对称轴,计算左右两侧等数量谱线的幅值差异。
- 对称性指标:均方误差(MSE)或相关系数。
- 优点:区分稳定信号与瞬态干扰(如开关噪声)。
- 缺点:对非对称窗函数(如指数窗)不适用。
- 计算步骤:
- 适用场景:电源谐波与瞬态噪声的区分。
3.4.5 统计显著性检验(如假设检验)
- 原理:通过统计模型测试峰值是否显著高于噪声背景。
- 计算步骤:
- 假设噪声服从特定分布(如高斯分布)。
- 计算峰值幅值超过噪声均值±k·σ(σ为噪声标准差)的概率。
- 若p值小于阈值(如0.05),则认为峰值显著。
- 优点:提供统计置信度,适合低信噪比场景。
- 缺点:需噪声分布先验知识,否则假设可能不成立。
- 计算步骤:
- 适用场景:生物医学信号分析(如脑电波特征检测)。
3.4.6 谐波成分验证
- 原理:真实信号可能伴随谐波分量,检查频谱是否出现整数倍频的谐波峰。
- 计算步骤:
- 查找基波峰值点(如最大峰)及其可能的谐波频点(2f₀、3f₀等)。
- 验证谐波幅值是否与基波成规律衰减(如1/n²衰减)。
- 优点:有效区分周期信号与随机干扰。
- 缺点:仅适用于含谐波结构的信号(如方波、振动冲击信号)。
- 计算步骤:
- 适用场景:电力系统谐波污染分析。
3.4.7 时频稳定性分析
- 原理:真实信号在时频分析中的峰值应具备时间稳定性,噪声则随机波动。
- 计算步骤:
- 对信号分段做短时傅里叶变换(STFT)。
- 统计目标频点在所有时间段的幅值方差或峰度。
- 方差越小,信号越稳定。
- 优点:动态监测信号可靠性。
- 缺点:计算量较大,实时性受限。
- 计算步骤:
- 适用场景:语音信号端点检测(如识别稳态语音段)。
3.4.8 模板匹配(互相关法)
- 原理:与理想信号模板的频谱或时域波形做互相关,评估匹配度。
- 计算步骤:
- 生成理论信号频谱模板(如正弦波主瓣形状)。
- 计算实测频谱片段与模板的归一化互相关系数。
- 相关系数越接近1,匹配度越高。
- 优点:高抗噪性,可精准识别模式化信号。
- 缺点:依赖先验模板,灵活性较低。
- 计算步骤:
- 适用场景:雷达脉冲信号识别。
3.4.9 总结
选型建议
评估方法 | 核心指标 | 适用信噪比 | 计算复杂度 | 典型场景 |
---|---|---|---|---|
SNR | 功率相对比值 | 中-高(>10dB) | 低 | 通信系统频点评估 |
3dB带宽法 | 主瓣宽度 | 高(>20dB) | 中 | 精密频率测量 |
统计显著性检验 | p值 | 低-中(<20dB) | 中高 | 生物医学信号检测 |
谐波验证 | 谐波衰减规律 | 高(需谐波) | 中 | 电力系统谐波分析 |
时频稳定性 | 方差 | 中-高 | 高 | 语音/雷达信号跟踪 |
综合策略
- 初步筛选:计算SNR和3dB带宽,快速排除弱信号。
- 二次验证:对疑似信号做统计显著性检验或谐波验证。
- 高级分析:若需高置信度,结合模板匹配和时频稳定性(如工业设备故障诊断)。
小结
- 通过多维指标联合判定,可显著提高信号真伪判断的鲁棒性。
- 例如,在环境噪声监测中:峰值SNR >15dB、3dB带宽 <0.5Hz,且通过统计显著性检验(p<0.01),则可判定为有效信号。
3.5 频率分析与矫正
确定谱线后就可以开始进一步计算频率, 注意不同算法的计算量, 部分性能不足的嵌入式单片机可能执行时间会达到秒级别.
我不想太过冗余的介绍, 毕竟要讲清楚的话就要长篇大论了, 请自行搜索相关内容.
本文只是ds简单介绍部分可以使用的步骤, 并非必须必要的, 而且不一定是对的, 请自行判断.
3.5.1 Zoom FFT(局部细化FFT)
- 原理:通过复调制(下变频)将目标频段搬移到低频,再利用低采样率重采样和FFT实现局部频谱细化。
- 优点:
- 可对任意频段局部细化,无需全局高密度采样。
- 计算量低于全频段高分辨FFT(适用于实时系统)。
- 缺点:
- 需要两次FFT(信号段滤波与重采样),实现复杂。
- 抗噪能力弱,频谱泄漏仍依赖窗函数抑制。
- 适用场景:窄带信号分析(如通信信道频率偏移监测)。
3.5.2 Chirp Z变换(CZT)
- 原理:通过螺旋形路径在复平面计算Z变换,自由指定频谱分析的频率范围和分辨率。
- 优点:
- 分辨率可灵活设定,突破FFT栅栏效应。
- 计算效率优于传统Z变换。
- 缺点:
- 高分辨率时计算量仍较大(需复数乘法累加)。
- 主瓣展宽明显,易受噪声干扰。
- 适用场景:高精度频偏测量(如雷达信号微小多普勒频移提取)。
3.5.3 相位补偿法(离散频谱插值)
- 原理:通过相邻谱线相位差估计信号的真实频率,结合FFT结果插值修正频谱幅值。
- 优点:
- 计算量小(仅插值修正),实时性强。
- 可大幅提升频率估计精度(如Rife-Vincent窗插值)。
- 缺点:
- 依赖单峰假设,多信号混叠时失效。
- 低信噪比(SNR)场景误差陡增。
- 适用场景:单频信号分析(如电力系统谐波检测)。
3.5.4 频谱峰值搜索 + 插值拟合
- 原理:先通过FFT粗测主瓣位置,再对主瓣内谱线插值(如多项式、高斯拟合)细化峰值。
- 优点:
- 实现简单,适合硬件化处理(无需复杂调制)。
- 对主瓣形态匹配的窗函数误差小(如Hanning窗三谱线插值)。
- 缺点:
- 仅改善频率估计精度,无法提升真实频谱分辨率。
- 旁瓣泄露严重时插值失效。
- 适用场景:仪器仪表领域(振动传感器频谱优化)。
3.5.5 现代超分辨算法(MUSIC/ESPRIT)
- 原理:基于信号子空间分解,利用噪声与信号的正交性实现超分辨频率估计。
- 优点:
- 突破瑞利极限,理论分辨率无限高。
- 多分量信号分离能力强。
- 缺点:
- 需预知信号源数目,计算复杂度高。
- 对噪声敏感,协方差矩阵估计误差影响稳定性。
- 适用场景:密集频谱分离(如声呐多目标测向)。
3.5.6 总结
方法对比与选型建议
方法 | 分辨率提升 | 抗噪性 | 计算量 | 实时性 | 适用信噪比 |
---|---|---|---|---|---|
Zoom FFT | 中 | 低 | 中 | 高 | >15dB |
CZT | 高 | 中 | 中高 | 中 | >20dB |
相位补偿法 | 中(仅频率) | 低 | 低 | 极高 | >30dB(单频) |
插值拟合 | 低 | 中 | 极低 | 极高 | >25dB |
MUSIC/ESPRIT | 极高 | 高 | 极高 | 低 | >10dB(需多快拍) |
选型原则
- 实时性优先:选相位补偿法或插值拟合。
- 分辨率优先:信噪比高选MUSIC/ESPRIT,中等选CZT。
- 工程实用性:Zoom FFT适合嵌入式系统,现代算法需高性能硬件支持。
注意事项
- 频谱泄漏抑制:细化前需优化窗函数(如Blackman-Harris窗降低旁瓣)。
- 噪声门限设置:低信噪比场景应结合统计阈值(如N-sigma准则)滤除虚假谱峰。
- 多分量信号处理:避免方法冲突(如插值法不适用多峰混叠,需配合盲源分离)。
小结:
- 通过组合多种方法(如先CZT粗筛频段,再MUSIC超分辨),可平衡效率与精度。
3.6 输出滤波
最后输出结果之前还需进行滤波处理, 避免跳变信号, 进一步确保了输出的正确性.
请根据实际需求选择或组合滤波算法, 滤波必然带来滞后问题, 请权衡利弊.
我不想太过冗余的介绍, 毕竟要讲清楚的话就要长篇大论了, 请自行搜索相关内容.
本文只是ds简单介绍部分可以使用的步骤, 并非必须必要的, 而且不一定是对的, 请自行判断.
算法 | 实时性 | 内存消耗 | 抗突变能力 | 适用场景 |
---|---|---|---|---|
滑动平均滤波 | 高 | 低 | 弱(滞后效应) | 稳态环境 |
卡尔曼滤波 | 中 | 中 | 强(动态模型) | 移动目标跟踪 |
中值滤波 | 中 | 中 | 极强(阶跃抑制) | 抗脉冲干扰 |
指数平滑 | 高 | 低 | 适中(参数可调) | 资源受限系统 |
推荐方案:
- 初始部署:滑动平均 + 中值滤波级联
- 优化版本:自适应卡尔曼滤波(过程噪声动态调整)
第4章 简单总结
恭喜你, 看完了~~~ 个人认为可以简单概括为以下内容
FMCW雷达测距通过发射频率线性变化的三角波信号,接收端将反射回波与发射信号混频生成中频差频信号,利用差频频率与目标距离的线性关系解算距离。
关键环节:
- 确保调频线性度
- 设计基带滤波器
- 最优频率解算