基于LMS自适应滤波器

clc;
close all;

Fs = 500;                                                     %设置采样频率
t = 0:1/Fs:3;  
t = t';
Size_t = size(t,1);
F1 = 7;
F2 = 13;
F3 = 23;
F4 = 50;
SNR = -100;         %信噪比

Signal = 10^(SNR/20)*(sin(2*pi*F1*t) + 0.5*sin(2*pi*F2*t) + 0.25*sin(2*pi*F3*t)); %生成信号
noise = 0.95*sin(2*pi*F4*t+pi/2);
Signal_noise = Signal + noise;                               %加入50Hz工频干扰

%定义滤波器   陷波器是滤波器的一种,特殊的一类,主要是它的阻带很窄
%陷波器顾名思义就是对特定频率的信号有着很强的衰减的滤波器
%LMS  最小均方误差

M = 2;                                    %定义FIR滤波器阶数
Signal_Len = Size_t;                      %定义信号数据的个数
niu = 1;                                  %算法调节步长控制因子
y_out = zeros(Signal_Len,1);              %滤波器输出
error_out = zeros(Signal_Len,1);          %误差输出            
w_out = zeros(Signal_Len,M);              %系数输出
for i=1:Signal_Len
    %数据输入
    if i == 1           %如果是第一次进入
        w = zeros(M,1); %初始化滤波器抽头系数
        x = zeros(M,1); %初始化信号向量
    end
  
    d = Signal_noise(i);                     %输入新的期望信号
    x = [sin(2*pi*F4*(i-1)/Fs)
         cos(2*pi*F4*(i-1)/Fs)];                 %输入新的信号矢量
    
    %算法正体
    y = x' * w;                              %计算滤波器输出
    error = d - y;                           %计算误差
    w_forward = w + niu * error * x;         %计算滤波器系数向量
    %变量更替
    w = w_forward;
    %滤波结果存储
    y_out(i) = y;
    error_out(i) = error;
    w_out(i,:) = w';
end

subplot(2,1,1);
plot(t,Signal);
title('原始信号');
xlabel('时间t/s');
subplot(2,1,2);
plot(t,Signal_noise);
title('加入干扰噪声的信号');
xlabel('时间t/s');

figure;
subplot(2,1,1);
plot(t,y_out);
title('滤波器输出');
xlabel('时间t/s');
subplot(2,1,2);
plot(t,error_out,'b');
title('输出误差');
xlabel('时间t/s');
axis([0,3,-3*10^-5,3*10^-5]);

figure;
plot(t(1:Signal_Len),w_out(1),'r',t(1:Signal_Len),w_out(2),'b');
title('自适应滤波器系数');
xlabel('时间t/s')

你可能感兴趣的:(FMCW,java,开发语言,后端)