一、问题背景与原理
1.1 直达波干扰问题
在地震勘探、雷达探测、超声检测等领域,直达波(Direct Wave)是指从震源/发射源直接传播到接收器的波,它通常很强,会掩盖来自目标/地下结构的反射信号。
特点:
- 能量强(通常是最强信号)
- 传播时间短(直达路径最短)
- 波形相对稳定
- 与目标信号在时域重叠
1.2 自适应滤波原理
自适应滤波通过调整滤波器系数,使输出信号尽可能接近期望信号。在直达波滤除中:
- 参考信号:已知的直达波模板或与直达波相关的信号
- 主输入:包含直达波和反射波的接收信号
- 目标:从主输入中减去估计的直达波,保留反射波
二、MATLAB实现
2.1 主程序
matlab
%% 自适应滤除直达波干扰
% 功能:使用自适应滤波技术去除地震/雷达信号中的直达波干扰
clear; clc; close all;
fprintf('=== 自适应滤除直达波干扰仿真开始 ===\n');
%% 1. 参数设置
fprintf('设置仿真参数...\n');
% 信号参数
fs = 1000; % 采样频率 (Hz)
T = 1; % 信号时长 (s)
t = 0:1/fs:T-1/fs; % 时间向量
N = length(t); % 采样点数
% 直达波参数
direct_delay = 0.02; % 直达波延迟 (s)
direct_amp = 1.0; % 直达波幅度
direct_freq = 50; % 直达波主频 (Hz)
% 反射波参数
reflection_delays = [0.05, 0.08, 0.12]; % 反射波延迟 (s)
reflection_amps = [0.3, 0.2, 0.15]; % 反射波幅度
reflection_freqs = [40, 45, 35]; % 反射波主频 (Hz)
% 噪声参数
SNR = 20; % 信噪比 (dB)
% 自适应滤波器参数
filter_order = 32; % 滤波器阶数
step_size = 0.01; % LMS步长
num_iterations = 100; % 迭代次数
%% 2. 生成仿真信号
fprintf('生成仿真信号...\n');
% 2.1 生成直达波
direct_wave = direct_amp * sin(2*pi*direct_freq*t) .* ...
exp(-(t-direct_delay).^2/(2*(0.005)^2));
% 2.2 生成反射波
reflection_wave = zeros(size(t));
for i = 1:length(reflection_delays)
reflection_wave = reflection_wave + ...
reflection_amps(i) * sin(2*pi*reflection_freqs(i)*t) .* ...
exp(-(t-reflection_delays(i)).^2/(2*(0.008)^2));
end
% 2.3 生成接收信号
received_signal = direct_wave + reflection_wave;
% 2.4 添加高斯白噪声
signal_power = mean(received_signal.^2);
noise_power = signal_power / (10^(SNR/10));
noise = sqrt(noise_power) * randn(size(t));
received_signal_noisy = received_signal + noise;
% 2.5 生成参考信号(直达波模板)
% 方法1:使用已知的直达波波形
reference_signal = direct_wave;
% 方法2:使用震源信号(如果没有精确模板)
% reference_signal = sin(2*pi*direct_freq*t);
% 方法3:使用带延迟的接收信号本身(盲自适应)
% reference_signal = [zeros(1, round(direct_delay*fs)), received_signal_noisy(1:end-round(direct_delay*fs))];
%% 3. 自适应滤波处理
fprintf('执行自适应滤波...\n');
% 3.1 LMS自适应滤波
[lms_output, lms_error, lms_coeffs] = lms_filter(...
reference_signal, received_signal_noisy, filter_order, step_size);
% 3.2 NLMS自适应滤波(归一化LMS)
nlms_step = 0.5; % NLMS步长
nlms_eps = 0.001; % 防止除零的小常数
[nlms_output, nlms_error, nlms_coeffs] = nlms_filter(...
reference_signal, received_signal_noisy, filter_order, nlms_step, nlms_eps);
% 3.3 RLS自适应滤波(递归最小二乘)
rls_lambda = 0.99; % 遗忘因子
rls_delta = 0.01; % 初始化参数
[rls_output, rls_error, rls_coeffs] = rls_filter(...
reference_signal, received_signal_noisy, filter_order, rls_lambda, rls_delta);
% 3.4 维纳滤波(作为基准)
wiener_coeffs = wiener_filter(reference_signal, received_signal_noisy, filter_order);
wiener_output = filter(wiener_coeffs, 1, reference_signal);
wiener_error = received_signal_noisy - wiener_output;
%% 4. 结果可视化
fprintf('可视化结果...\n');
% 4.1 原始信号对比
figure('Position', [100, 100, 1200, 800]);
% 子图1:纯净信号
subplot(3, 3, 1);
plot(t, direct_wave, 'r-', 'LineWidth', 1.5); hold on;
plot(t, reflection_wave, 'b-', 'LineWidth', 1.5);
plot(t, received_signal, 'k-', 'LineWidth', 2);
xlabel('时间 (s)'); ylabel('幅度');
title('纯净信号');
legend('直达波', '反射波', '合成信号', 'Location', 'best');
grid on;
% 子图2:含噪信号
subplot(3, 3, 2);
plot(t, received_signal_noisy, 'k-', 'LineWidth', 1.5);
xlabel('时间 (s)'); ylabel('幅度');
title('含噪接收信号');
grid on;
% 子图3:参考信号
subplot(3, 3, 3);
plot(t, reference_signal, 'g-', 'LineWidth', 1.5);
xlabel('时间 (s)'); ylabel('幅度');
title('参考信号(直达波模板)');
grid on;
% 4.2 滤波结果对比
% 子图4:LMS滤波结果
subplot(3, 3, 4);
plot(t, received_signal_noisy, 'k:', 'LineWidth', 1); hold on;
plot(t, lms_output, 'r-', 'LineWidth', 1.5);
plot(t, lms_error, 'b-', 'LineWidth', 1.5);
xlabel('时间 (s)'); ylabel('幅度');
title('LMS自适应滤波');
legend('原始含噪信号', '估计直达波', '残余信号', 'Location', 'best');
grid on;
% 子图5:NLMS滤波结果
subplot(3, 3, 5);
plot(t, received_signal_noisy, 'k:', 'LineWidth', 1); hold on;
plot(t, nlms_output, 'r-', 'LineWidth', 1.5);
plot(t, nlms_error, 'b-', 'LineWidth', 1.5);
xlabel('时间 (s)'); ylabel('幅度');
title('NLMS自适应滤波');
legend('原始含噪信号', '估计直达波', '残余信号', 'Location', 'best');
grid on;
% 子图6:RLS滤波结果
subplot(3, 3, 6);
plot(t, received_signal_noisy, 'k:', 'LineWidth', 1); hold on;
plot(t, rls_output, 'r-', 'LineWidth', 1.5);
plot(t, rls_error, 'b-', 'LineWidth', 1.5);
xlabel('时间 (s)'); ylabel('幅度');
title('RLS自适应滤波');
legend('原始含噪信号', '估计直达波', '残余信号', 'Location', 'best');
grid on;
% 子图7:维纳滤波结果
subplot(3, 3, 7);
plot(t, received_signal_noisy, 'k:', 'LineWidth', 1); hold on;
plot(t, wiener_output, 'r-', 'LineWidth', 1.5);
plot(t, wiener_error, 'b-', 'LineWidth', 1.5);
xlabel('时间 (s)'); ylabel('幅度');
title('维纳滤波');
legend('原始含噪信号', '估计直达波', '残余信号', 'Location', 'best');
grid on;
% 4.3 频谱分析
subplot(3, 3, 8);
[freq, spec_original] = pwelch(received_signal_noisy, hamming(256), 128, 1024, fs);
[freq, spec_lms] = pwelch(lms_error, hamming(256), 128, 1024, fs);
plot(freq, 10*log10(spec_original), 'k-', 'LineWidth', 1.5); hold on;
plot(freq, 10*log10(spec_lms), 'r-', 'LineWidth', 1.5);
xlabel('频率 (Hz)'); ylabel('功率谱密度 (dB/Hz)');
title('频谱对比');
legend('原始信号', 'LMS滤波后', 'Location', 'best');
grid on;
% 4.4 滤波器系数
subplot(3, 3, 9);
stem(1:filter_order, lms_coeffs, 'b.', 'MarkerSize', 10); hold on;
stem(1:filter_order, nlms_coeffs, 'r.', 'MarkerSize', 10);
stem(1:filter_order, rls_coeffs, 'g.', 'MarkerSize', 10);
stem(1:filter_order, wiener_coeffs, 'k.', 'MarkerSize', 10);
xlabel('滤波器系数索引'); ylabel('系数值');
title('滤波器系数对比');
legend('LMS', 'NLMS', 'RLS', 'Wiener', 'Location', 'best');
grid on;
%% 5. 性能指标评估
fprintf('评估性能指标...\n');
% 5.1 计算信干比改善
SIR_original = 10*log10(mean(reflection_wave.^2) / mean(direct_wave.^2));
SIR_lms = 10*log10(mean(reflection_wave.^2) / mean(lms_error.^2));
SIR_nlms = 10*log10(mean(reflection_wave.^2) / mean(nlms_error.^2));
SIR_rls = 10*log10(mean(reflection_wave.^2) / mean(rls_error.^2));
SIR_wiener = 10*log10(mean(reflection_wave.^2) / mean(wiener_error.^2));
% 5.2 计算均方误差
MSE_lms = mean(lms_error.^2);
MSE_nlms = mean(nlms_error.^2);
MSE_rls = mean(rls_error.^2);
MSE_wiener = mean(wiener_error.^2);
% 5.3 计算相关系数
corr_original = corrcoef(reflection_wave, received_signal_noisy);
corr_lms = corrcoef(reflection_wave, lms_error);
corr_nlms = corrcoef(reflection_wave, nlms_error);
corr_rls = corrcoef(reflection_wave, rls_error);
corr_wiener = corrcoef(reflection_wave, wiener_error);
% 5.4 显示结果
fprintf('\n=== 性能指标对比 ===\n');
fprintf('%-15s %-10s %-10s %-10s\n', '方法', 'SIR(dB)', 'MSE', '相关系数');
fprintf('%s\n', repmat('-', 1, 45));
fprintf('%-15s %-10.2f %-10.6f %-10.4f\n', '原始信号', SIR_original, mean(direct_wave.^2), corr_original(1,2));
fprintf('%-15s %-10.2f %-10.6f %-10.4f\n', 'LMS', SIR_lms, MSE_lms, corr_lms(1,2));
fprintf('%-15s %-10.2f %-10.6f %-10.4f\n', 'NLMS', SIR_nlms, MSE_nlms, corr_nlms(1,2));
fprintf('%-15s %-10.2f %-10.6f %-10.4f\n', 'RLS', SIR_rls, MSE_rls, corr_rls(1,2));
fprintf('%-15s %-10.2f %-10.6f %-10.4f\n', 'Wiener', SIR_wiener, MSE_wiener, corr_wiener(1,2));
% 5.5 计算改善百分比
improvement_lms = (SIR_lms - SIR_original)/abs(SIR_original)*100;
improvement_nlms = (SIR_nlms - SIR_original)/abs(SIR_original)*100;
improvement_rls = (SIR_rls - SIR_original)/abs(SIR_original)*100;
improvement_wiener = (SIR_wiener - SIR_original)/abs(SIR_original)*100;
fprintf('\nSIR改善百分比:\n');
fprintf('LMS: %.1f%%\n', improvement_lms);
fprintf('NLMS: %.1f%%\n', improvement_nlms);
fprintf('RLS: %.1f%%\n', improvement_rls);
fprintf('Wiener: %.1f%%\n', improvement_wiener);
%% 6. 收敛性分析
fprintf('分析收敛性...\n');
figure('Position', [100, 100, 800, 400]);
% 计算学习曲线
num_trials = 50;
learning_curves = zeros(num_trials, N-filter_order);
for trial = 1:num_trials
% 每次试验使用不同的噪声实现
noise_trial = sqrt(noise_power) * randn(size(t));
received_trial = received_signal + noise_trial;
% 运行LMS并记录误差
[~, error_trial, ~] = lms_filter(reference_signal, received_trial, filter_order, step_size);
learning_curves(trial, :) = error_trial(filter_order+1:end).^2;
end
% 平均学习曲线
mean_learning_curve = mean(learning_curves, 1);
std_learning_curve = std(learning_curves, 0, 1);
subplot(1, 2, 1);
plot(mean_learning_curve, 'b-', 'LineWidth', 2); hold on;
plot(mean_learning_curve + std_learning_curve, 'b:', 'LineWidth', 1);
plot(mean_learning_curve - std_learning_curve, 'b:', 'LineWidth', 1);
xlabel('迭代次数'); ylabel('均方误差');
title('LMS学习曲线(50次试验平均)');
grid on;
% 收敛时间分析
convergence_threshold = 0.01; % 收敛阈值
convergence_point = find(mean_learning_curve < convergence_threshold, 1);
if ~isempty(convergence_point)
fprintf('LMS收敛到阈值%.4f需要%d次迭代\n', convergence_threshold, convergence_point);
else
fprintf('LMS未在%d次迭代内收敛到阈值%.4f\n', N-filter_order, convergence_threshold);
end
% 步长影响分析
subplot(1, 2, 2);
step_sizes = [0.001, 0.005, 0.01, 0.05, 0.1];
colors = ['b', 'g', 'r', 'c', 'm'];
hold on;
for i = 1:length(step_sizes)
[~, error_temp, ~] = lms_filter(reference_signal, received_signal_noisy, filter_order, step_sizes(i));
mse_temp = movmean(error_temp.^2, 100);
plot(mse_temp, 'Color', colors(i), 'LineWidth', 1.5, 'DisplayName', sprintf('μ=%.3f', step_sizes(i)));
end
xlabel('迭代次数'); ylabel('均方误差');
title('不同步长的收敛性能');
legend('Location', 'best');
grid on;
%% 7. 实际应用场景模拟
fprintf('模拟实际应用场景...\n');
% 7.1 地震勘探场景
fprintf('模拟地震勘探场景...\n');
% 生成地震记录(共中心点道集)
num_traces = 24; % 道数
trace_spacing = 10; % 道间距 (m)
velocity = 2000; % 地层速度 (m/s)
seismic_data = zeros(num_traces, N);
for trace = 1:num_traces
% 计算偏移距
offset = (trace - (num_traces+1)/2) * trace_spacing;
% 直达波到达时间
direct_arrival = sqrt(offset^2 + 10^2) / velocity; % 假设深度10m
% 反射波到达时间
reflection_arrival = sqrt(offset^2 + 50^2) / velocity; % 假设反射层深度50m
% 生成该道的直达波和反射波
direct_trace = 1.0 * sin(2*pi*direct_freq*t) .* ...
exp(-(t-direct_arrival).^2/(2*(0.005)^2));
reflection_trace = 0.3 * sin(2*pi*reflection_freqs(1)*t) .* ...
exp(-(t-reflection_arrival).^2/(2*(0.008)^2));
% 叠加并添加噪声
seismic_data(trace, :) = direct_trace + reflection_trace + ...
0.1*randn(size(t));
end
% 对每一道应用自适应滤波
filtered_seismic = zeros(size(seismic_data));
for trace = 1:num_traces
% 使用第一道作为参考信号(假设第一道主要是直达波)
if trace == 1
filtered_seismic(trace, :) = seismic_data(trace, :);
else
reference = seismic_data(1, :); % 参考信号
[~, filtered_seismic(trace, :), ~] = lms_filter(...
reference, seismic_data(trace, :), filter_order, step_size);
end
end
% 可视化地震剖面
figure('Position', [100, 100, 1000, 400]);
subplot(1, 2, 1);
imagesc(1:num_traces, t, seismic_data);
xlabel('道号'); ylabel('时间 (s)');
title('原始地震剖面');
colorbar;
axis xy;
subplot(1, 2, 2);
imagesc(1:num_traces, t, filtered_seismic);
xlabel('道号'); ylabel('时间 (s)');
title('自适应滤波后地震剖面');
colorbar;
axis xy;
%% 8. 保存结果
fprintf('保存结果...\n');
% 保存工作空间变量
save('adaptive_direct_wave_removal_results.mat', ...
'received_signal_noisy', 'reference_signal', ...
'lms_output', 'lms_error', 'lms_coeffs', ...
'nlms_output', 'nlms_error', 'nlms_coeffs', ...
'rls_output', 'rls_error', 'rls_coeffs', ...
'wiener_output', 'wiener_error', 'wiener_coeffs', ...
'seismic_data', 'filtered_seismic');
fprintf('\n=== 仿真完成 ===\n');
fprintf('结果已保存到 adaptive_direct_wave_removal_results.mat\n');
2.2 自适应滤波函数
matlab
%% LMS自适应滤波函数
function [output, error, coeffs] = lms_filter(reference, desired, order, mu)
% LMS自适应滤波算法
% 输入:
% reference: 参考信号(直达波模板)
% desired: 期望信号(含噪接收信号)
% order: 滤波器阶数
% mu: 步长参数
% 输出:
% output: 滤波器输出(估计的直达波)
% error: 误差信号(去除了直达波的反射波)
% coeffs: 收敛后的滤波器系数
N = length(desired);
output = zeros(1, N);
error = zeros(1, N);
coeffs = zeros(order, 1);
% 初始化
w = zeros(order, 1);
% LMS迭代
for n = order:N
% 构造参考信号向量
x = reference(n:-1:n-order+1)';
% 计算滤波器输出
y = w' * x;
% 计算误差
e = desired(n) - y;
% 更新滤波器系数
w = w + mu * e * x;
% 存储结果
output(n) = y;
error(n) = e;
end
% 返回最终系数
coeffs = w;
end
%% NLMS自适应滤波函数
function [output, error, coeffs] = nlms_filter(reference, desired, order, mu, eps)
% 归一化LMS自适应滤波算法
% 输入:
% reference: 参考信号
% desired: 期望信号
% order: 滤波器阶数
% mu: 步长参数(0<mu<2)
% eps: 防止除零的小常数
% 输出:
% output: 滤波器输出
% error: 误差信号
% coeffs: 收敛后的滤波器系数
N = length(desired);
output = zeros(1, N);
error = zeros(1, N);
coeffs = zeros(order, 1);
% 初始化
w = zeros(order, 1);
% NLMS迭代
for n = order:N
% 构造参考信号向量
x = reference(n:-1:n-order+1)';
% 计算滤波器输出
y = w' * x;
% 计算误差
e = desired(n) - y;
% 更新滤波器系数(归一化)
norm_x = x' * x;
w = w + (mu / (norm_x + eps)) * e * x;
% 存储结果
output(n) = y;
error(n) = e;
end
% 返回最终系数
coeffs = w;
end
%% RLS自适应滤波函数
function [output, error, coeffs] = rls_filter(reference, desired, order, lambda, delta)
% 递归最小二乘自适应滤波算法
% 输入:
% reference: 参考信号
% desired: 期望信号
% order: 滤波器阶数
% lambda: 遗忘因子(0.9<lambda<1)
% delta: 初始化参数
% 输出:
% output: 滤波器输出
% error: 误差信号
% coeffs: 收敛后的滤波器系数
N = length(desired);
output = zeros(1, N);
error = zeros(1, N);
coeffs = zeros(order, 1);
% 初始化
w = zeros(order, 1);
P = (1/delta) * eye(order);
% RLS迭代
for n = order:N
% 构造参考信号向量
x = reference(n:-1:n-order+1)';
% 计算先验误差
y = w' * x;
e = desired(n) - y;
% 计算增益向量
k = (P * x) / (lambda + x' * P * x);
% 更新滤波器系数
w = w + k * e;
% 更新逆相关矩阵
P = (1/lambda) * (P - k * x' * P);
% 存储结果
output(n) = y;
error(n) = e;
end
% 返回最终系数
coeffs = w;
end
%% 维纳滤波函数
function coeffs = wiener_filter(reference, desired, order)
% 维纳滤波(最小均方误差滤波)
% 输入:
% reference: 参考信号
% desired: 期望信号
% order: 滤波器阶数
% 输出:
% coeffs: 维纳滤波器系数
N = length(desired);
% 计算自相关和互相关
R = zeros(order, order);
p = zeros(order, 1);
for i = 1:order
for j = 1:order
% 自相关
R(i, j) = sum(reference(order-i+1:N-i+1) .* reference(order-j+1:N-j+1)) / (N-order+1);
end
% 互相关
p(i) = sum(desired(order:N) .* reference(order-i+1:N-i+1)) / (N-order+1);
end
% 求解维纳-霍夫方程
coeffs = R \ p;
end
三、实际应用建议
3.1 参考信号选择策略
| 场景 | 参考信号选择 | 说明 |
|---|---|---|
| 地震勘探 | 震源信号 | 已知震源波形 |
| 雷达探测 | 发射信号副本 | 发射机同步信号 |
| 超声检测 | 激励信号 | 探头激励波形 |
| 无先验知识 | 首道信号 | 假设首道主要是直达波 |
| 无先验知识 | 延迟信号 | 使用接收信号自身延迟 |
3.2 参数选择指南
滤波器阶数选择:
matlab
% 经验公式:阶数 ≈ 采样率 × 直达波持续时间 × 2
filter_order = round(fs * direct_duration * 2);
步长选择:
matlab
% LMS步长:0.001 ~ 0.1
% 稳定条件:mu < 2 / (trace(R)),其中R是自相关矩阵
mu = 0.01; % 保守选择
% NLMS步长:0.1 ~ 1.0
mu_nlms = 0.5; % 通常选择0.5左右
3.3 性能优化技巧
1. 预白化处理:
matlab
% 对参考信号进行预白化,提高收敛速度
[~, whitening_filter] = whitening(reference_signal);
reference_whitened = filter(whitening_filter, 1, reference_signal);
2. 变步长LMS:
matlab
% 根据误差大小调整步长
function mu_adaptive = variable_step(error, mu_max, mu_min)
% 误差大时用大步长,误差小时用小步长
error_norm = abs(error) / max(abs(error));
mu_adaptive = mu_min + (mu_max - mu_min) * exp(-error_norm);
end
3. 块处理(Block LMS):
matlab
% 块处理减少计算量
block_size = 100;
for block = 1:block_size:N-block_size
% 在块内使用相同的滤波器系数
% 减少系数更新频率
end
参考代码 自适应滤除直达波干扰 www.youwenfan.com/contentcsu/59801.html
四、扩展应用
4.1 多通道自适应滤波
matlab
%% 多通道自适应滤波(用于阵列信号处理)
function [outputs, errors] = multichannel_lms(reference, desired_array, order, mu)
% 多通道LMS自适应滤波
% desired_array: 多通道接收信号 [通道数 × 时间]
[num_channels, N] = size(desired_array);
outputs = zeros(num_channels, N);
errors = zeros(num_channels, N);
% 每个通道独立的自适应滤波器
for ch = 1:num_channels
[outputs(ch, :), errors(ch, :), ~] = lms_filter(...
reference, desired_array(ch, :), order, mu);
end
end
4.2 非线性自适应滤波
matlab
%% 基于核的自适应滤波(处理非线性关系)
function [output, error] = kernel_lms(reference, desired, order, mu, kernel_param)
% 核LMS算法
% 使用高斯核将输入映射到高维空间
N = length(desired);
output = zeros(1, N);
error = zeros(1, N);
% 字典(支持向量)
dictionary = [];
alpha = [];
for n = 1:N
% 当前输入向量
x = reference(n:-1:n-order+1)';
if isempty(dictionary)
% 初始化字典
dictionary = x;
alpha = desired(n) / (kernel(x, x, kernel_param) + 1e-6);
else
% 计算核函数
k = kernel(x, dictionary, kernel_param);
% 预测输出
y = alpha' * k;
% 计算误差
e = desired(n) - y;
% 更新系数
alpha = alpha + mu * e * k;
% 更新字典(选择性添加)
if abs(e) > 0.1
dictionary = [dictionary, x];
alpha = [alpha; mu * e];
end
end
output(n) = y;
error(n) = e;
end
end
function k = kernel(x, dictionary, sigma)
% 高斯核函数
k = exp(-sum((dictionary - x).^2, 1) / (2*sigma^2));
end
五、故障排除
5.1 常见问题及解决方案
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| 发散 | 步长过大 | 减小步长μ |
| 收敛慢 | 特征值扩散 | 使用NLMS或RLS |
| 残留直达波 | 滤波器阶数不足 | 增加滤波器阶数 |
| 反射波失真 | 过度滤波 | 调整步长和阶数 |
| 不稳定 | 数值问题 | 添加正则化项 |
5.2 诊断工具
matlab
%% 诊断自适应滤波性能
function diagnose_adaptive_filter(reference, desired, output, error, coeffs)
% 诊断自适应滤波器的性能
figure('Position', [100, 100, 1000, 600]);
% 1. 误差分布
subplot(2, 3, 1);
histogram(error, 50, 'Normalization', 'probability');
xlabel('误差'); ylabel('概率');
title('误差分布');
grid on;
% 2. 自相关函数
subplot(2, 3, 2);
[acf, lags] = autocorr(error, 100);
stem(lags, acf, 'b.', 'MarkerSize', 10);
xlabel('滞后'); ylabel('自相关');
title('误差自相关');
grid on;
% 3. 频谱分析
subplot(2, 3, 3);
[freq, spec] = pwelch(error, hamming(256), 128, 1024, 1000);
plot(freq, 10*log10(spec), 'b-', 'LineWidth', 1.5);
xlabel('频率 (Hz)'); ylabel('功率谱密度 (dB/Hz)');
title('误差频谱');
grid on;
% 4. 滤波器系数收敛
subplot(2, 3, 4);
plot(coeffs, 'b-', 'LineWidth', 1.5);
xlabel('系数索引'); ylabel('系数值');
title('滤波器系数');
grid on;
% 5. 学习曲线
subplot(2, 3, 5);
mse = movmean(error.^2, 100);
plot(mse, 'b-', 'LineWidth', 1.5);
xlabel('迭代次数'); ylabel('均方误差');
title('学习曲线');
grid on;
% 6. 相干性分析
subplot(2, 3, 6);
[Cxy, f] = mscohere(reference, desired, hamming(256), 128, 1024, 1000);
plot(f, Cxy, 'b-', 'LineWidth', 1.5);
xlabel('频率 (Hz)'); ylabel('相干系数');
title('参考信号与期望信号相干性');
grid on;
end
六、总结
自适应滤波技术是去除直达波干扰的有效方法,关键点包括:
- 参考信号选择:直接影响滤波效果,应尽可能准确反映直达波特性
- 算法选择 :
- LMS:简单稳定,适合实时处理
- NLMS:收敛更快,对输入功率变化不敏感
- RLS:收敛最快,但计算复杂度高
- 维纳滤波:需要统计信息,适合离线处理
- 参数调优:阶数和步长是关键参数,需要平衡收敛速度和稳态误差
- 实际应用:考虑计算效率、鲁棒性和实时性要求