自适应滤波器

一、时域自适应线谱增强器
二、自适应滤波器 | 频域自适应滤波器


文章目录

  • 自适应滤波器
  • 前言
  • 基本原理
  • LMS算法
  • 主函数
  • 仿真结果
  • 总结

前言

频域自适应滤波器应用DFT理论的“重叠保留”法或“重叠相加”法,对FIR数字滤波器的输入数据进行分块处理,将线性卷积化为循环卷积,再利用DFT的循环卷积定理,将时域循环卷积化为频域乘积之后用某种算法自动修正频域权矢量,从而达到自适应滤波的目的。


基本原理

LMS算法

function [yn,h,en] = C_FLMS(xn,dn,M)
% 常规频域自适应线谱增强器
%   xn   -->  带噪信号(列向量)
%   M    -->  自适应滤波器阶数(标量)
%   tao  -->  解相关矢量(标量)
%   yn   <--  滤波信号(列向量) --> len_xn*1
%   W    <--  权值矢量(矩阵)   --> M*len_xn
%   en   <--  误差(列向量)     --> len_xn*1
rho_max = max(eig(xn*xn'));       % 输入信号相关矩阵的最大特征值
mu = (1/rho_max/2) ;              % 收敛因子 0 < mu < 1/rho
len_xn = length(xn);
yn = xn;
h = zeros(1,M);
en = zeros(1,len_xn);             % 误差序列,en(k)表示第k次迭代时预期输出与实际输入的误差
batchSize = fix((len_xn)/M);
for i=1:batchSize-1x=fft(xn((i-1)*M+1:(i+1)*M));H=fft([h,zeros(1,M)]);ol=real(ifft(x.*H));yn(i*M+1:(i+1)*M) = ol(M+1:2*M);en(i*M+1:(i+1)*M) = dn(i*M+1:(i+1)*M)-yn(i*M+1:(i+1)*M);E = fft([zeros(1,M),en(i*M+1:(i+1)*M)]);o2 = real(ifft(E.*conj(x)));V = o2(1:M);h = h+2*mu*V;
end
yn = yn(1:batchSize*M);
end

主函数

%%
close all;clear;clc;
% 1. 创建仿真信号
fs = 16000;             % 采样频率
f0 = [80,160];          % 信号基频
A = [0.5,0.5];            % 幅值
phi = [0,0];            % 初始相位
T = 10;                 % 信号时长
SNR_in = -41;           % 输入信噪比
t = 0:1/fs:T-1/fs;
s_k = sum(A'.*sin(2*pi*f0'*t+phi'),1);              % 输出原始信号(行向量)
n_k = randn(size(s_k));                             % 用randn函数产生高斯白噪声
signal_power = mean(s_k.*s_k);                      % 求出信号的平均能量
noise_power = mean(n_k.*n_k);                       % 求出噪声的平均能量
noise_variance = signal_power / ( 10^(SNR_in/10) );    % 计算出噪声设定的方差值
n_k = sqrt(noise_variance/noise_power)*n_k;         % 按噪声的平均能量构成相应的白噪声
x_k = s_k+n_k;                                      % 构成带噪语音
SNR_signal(s_k,x_k)
% 2. 滤波,降采样
s_k_d = lowpass(s_k,1000,fs);
s_k_j = resample(s_k_d,1,5);
x_k_d = lowpass(x_k,1000,fs);
x_k_j = resample(x_k_d,1,5);
snr(s_k_j,x_k_j)
fs_j = fs/5;
% plot_s1(s_k_j,x_k_j,fs_j);  % 看一下频谱
%% 3. 线谱增强
M = 512;               % 滤波器阶数
mu = 0.00001;           % LMS迭代步长
[yn,w,en] = C_FLMS(x_k_j,s_k_j,M);
%
plot_s2(yn,s_k_j);               % 给出一个误差收敛曲线图
plot_s3(yn,x_k_j,s_k_j,fs_j/2);  % 给出一个输入输出信噪比对比图
plot_s4(yn,x_k_j,s_k_j,fs_j);    % 给出滤波前后短时傅里叶变化
plot_s5(s_k_j,w(end,:),fs_j);    % 最优频域自适应权值向量与稳态自适应权值向量的对比x_f = 0:fs_j/M:fs_j;
W = fft(w(end,:));
figure;plot(x_f(1:M/2),abs(W(1:M/2)));
%%
function plot_s1(s_k_j,x_k_j,fs)
% 看一下滤波后的输入信号和参考信号频谱
figure(1);
windowLen = 2^fix(log2(fs));
s1 = s_k_j(1:windowLen);
s2 = x_k_j(1:windowLen);
S1 = abs(fft(s1));
S2 = abs(fft(s2));
x_f = 0:fs/windowLen:fs-fs/windowLen;
subplot(211);plot(x_f(1:windowLen/2),S1(1:windowLen/2));xlabel('频率');ylabel('幅值');title('滤波后参考信号频谱');
subplot(212);plot(x_f(1:windowLen/2),S2(1:windowLen/2));xlabel('频率');ylabel('幅值');title('滤波后输入信号频谱');
endfunction plot_s2(yn,dn)
% 给出一个误差收敛曲线图
figure(2);plot(yn-dn(1:length(yn)));xlabel('采样点');ylabel('误差');title('训练迭代误差');
endfunction plot_s3(yn,xn,dn,fs)
% 每隔N点做一次SNR
len = length(yn);
N = floor(len/fs);
snr_in = zeros(1,N+1);
snr_out = zeros(1,N+1);
snr_gain = zeros(1,N+1);
x_t = 0:1:N;
for i=1:Nindex = (i-1)*fs+1:i*fs;
%     snr_in(i+1) = snr(dn(index),xn(index));
%     snr_out(i+1) = snr(dn(index),yn(index));
%     snr_gain(i+1) = snr_out(i+1)-snr_in(i+1);snr_in(i+1) = SNR_signal(dn(index),xn(index));snr_out(i+1) = SNR_signal(dn(index),yn(index));snr_gain(i+1) = snr_out(i+1)-snr_in(i+1);
end
figure(3);plot(x_t,snr_in,'o-g');hold on;plot(x_t,snr_out,'o-b');hold on;plot(x_t,snr_gain,'o-r');
xlabel('采样时间/s');ylabel('信噪比/dB');title('信噪比对比图');
legend('输入信噪比','输出信噪比','信噪比增益');
endfunction plot_s4(yn,xn,dn,fs)
% 给出滤波前后短时傅里叶变化
figure(4);
subplot(311);plot_lofar(dn,fs,'参考信号LoFar谱图',0,600);
subplot(312);plot_lofar(xn,fs,'输入信号LoFar谱图',0,600);
subplot(313);plot_lofar(yn,fs,'输出信号LoFar谱图',0,600);
endfunction plot_s5(dn,w,fs)
LF = 0;
HF = 600;
windowLen = length(w);
s = dn(end-windowLen+1:end);
S = abs(fft(s));
W = abs(fft(w));
SS = mapminmax(S(1:windowLen/2),0,1);
WW = mapminmax(W(1:windowLen/2),0,1);
x_f = 0:fs/windowLen:fs;
index = max(1,floor(LF/fs*windowLen)):floor(HF/fs*windowLen);
figure(5);
plot(x_f(index),SS(index),'k');hold on;plot(x_f(index),WW(index),'rx-');
xlabel('频率/Hz');ylabel('幅度');legend('最优','LMS');
endfunction plot_lofar(s,fs,str_title,LF,HF)
%绘制lofar谱图(2048点FFT)
%   s          --> 输入时域信号(行向量)
%   fs         --> 采样频率(标量)
%   str_title  --> 标题
if(nargin==2)str_title = 'LoFar谱图';
elseif(nargin==3)LF = 0;HF = 550;
elseif(nargin==4)HF = 550;
elseif(nargin<2 || nargin>5)error('请检查输入参数的个数!');
end
windowLen = 2048;
x_i_f = max(1,floor(LF/fs*windowLen)):floor(HF/fs*windowLen);
[S, F, T] = spectrogram(s, hanning(windowLen), windowLen/2, windowLen, fs);
S = mapminmax(S',0,1)';
imagesc(F(x_i_f),T,20*log10(abs(S(x_i_f,:)')));colorbar;colormap("jet");set(gca,'YDir','normal');
ylabel('时间 (s)');xlabel('频率 (Hz)');title(str_title);
endfunction snr = SNR_signal(signal,noiseSignal)
%计算信噪比
%   s_k    --> 原始信号(行向量)
%   x_k    --> 带噪信号(行向量)
%   snr    <-- 信噪比(标)
signalPower = mean(signal.*signal);                          % 求出信号功率
noisePower = mean((noiseSignal-signal).*(noiseSignal-signal));    % 求出噪声功率
snr = 10*log10(signalPower/noisePower);                      % 由信噪比定义求出信噪比,单位为db
end




仿真结果

  • 输入信号信噪比为−41dB-41dB−41dB,经过低通滤波降采样之后信号信噪比为−33.3975dB-33.3975dB−33.3975dB,处理结果如下所示:

        
训练迭代误差                            输入输出信噪比对比图         
滤波前后LoFar谱对比图                            最优和稳态频域权值向量对比图


总结

训练速度远比时域LMS快,在更低信噪比情况下,反而有更高的信噪比增益。

自适应滤波器 | 频域自适应滤波器(FLMS)相关推荐

  1. 频域自适应 matlab,频域自适应滤波算法及应用.doc

    频域自适应滤波算法及应用 本科毕业设计 频域自适应滤波算法及应用 华 南 理 工 大 学 毕 业 设 计 (论文) 任 务 书 兹发给 级 班学生毕业设计(论文)任务书,内容如下: 1.毕业设计(论文 ...

  2. 新息自适应卡尔曼滤波matlab代码,基于新息协方差的自适应渐消卡尔曼滤波器

    第33卷第12期 系统工程与电子技术 V01.33 No.12 2011年12月 Systems Engineering and Electronics 'December 2011 文章编号:i00 ...

  3. 新息自适应卡尔曼滤波matlab代码,基于新息协方差的自适应渐消卡尔曼滤波器.pdf...

    第33卷第12期 系统工程与电子技术 V01.33No.12 andElectronics 'December2011 2011年12月 SystemsEngineering 文章编号:i001-50 ...

  4. 经典滤波器与现代滤波器

    经典滤波器就是我们熟知的FIR和IIR,经典滤波器要求对输入信号的频率范围已知,从功能上可划分为: 低通滤波器(LPF) 高通滤波器(HPF) 带通滤波器(BPF) 带阻滤波器(BSF) 陷波滤波器( ...

  5. 有源滤波器和无源滤波器的区别?(硬件每日一题)

    表面区别:一个要电源供电,一个不用 有源可以做的很小,集成,无源比较难 一个主要处理信号 一个常常在电源里使用-- 无源可以看成额外吸收谐波的负载,被动的吸收谐波:有源可以看成电源,主动的生成反向谐波 ...

  6. IIR滤波器和FIR滤波器的区别与联系

    IIR滤波器和FIR滤波器的区别与联系_jinjun_新浪博客  http://blog.sina.com.cn/s/blog_6281182601019rst.html 1.两种滤波器都是数字滤波器 ...

  7. 滑动平均滤波器与CIC滤波器

    文章目录 前言 一.传递函数 1.什么是传递函数 2.FIR与IIR在传递函数上的区别(FIR) 3.FIR与IIR在传递函数上的区别(IIR) 4.FIR的抽头系数/FIR的阶数 5.FIR滤波器的 ...

  8. matlab 多通道余弦调制镜像滤波器组_滤波器基础:抗混叠

    电子万花筒平台核心服务  中国最活跃的射频微波天线雷达微信技术群 电子猎头:帮助电子工程师实现人生价值!  电子元器件:价格比您现有供应商最少降低10% 射频微波天线新产品新技术发布平台:让更多优秀的 ...

  9. 抽取_内插_半带滤波器_多相滤波器

    文章目录 半带滤波器 多相抽取滤波器 多相内插滤波器 半带抽取器和半带内插器 参考资料:Xilinx FIR Compiler v7.2 LogiCORE IP Product Guide PG149 ...

  10. RC滤波器与LC滤波器详解(RC滤波器与LC滤波器区别,RC滤波器和LC滤波器工作原理和经典设计)

    RC滤波器与LC滤波器详解(RC滤波器与LC滤波器区别,RC滤波器和LC滤波器工作原理和经典设计) [导读] LC滤波器应用的频率范围为1kHz-1.5GHz.由于受限于其中电感的Q值,频率响应的截至 ...

最新文章

  1. c++ 界面交互影响处理代码执行速度_原创 | 某SCADA的远程代码执行漏洞挖掘与利用...
  2. Spring之AOP由浅入深
  3. java使用xml存储数据_聊一聊 Redis 数据内部存储使用到的数据结构
  4. spark简介(大数据技术)
  5. logstash增量同步mysql数据到es
  6. Cocos2d-x动作CCAction
  7. ArcGIS属性字段名设置不超过四个中文的解决方法
  8. return、break、continue三者的区别
  9. imx6q LINUX 启动时间优化
  10. 按键精灵手机助手错误:at tempt to compare nu11 with number
  11. obj文件格式详解及示例
  12. R语言单因素分析案例
  13. html 倒计时毫秒,实现毫秒级倒计时
  14. 智真长老临别四句偈言 智深圆寂偈语
  15. 在quartus II15.0中调用Modelsim进行时序仿真时出现Rerun the EDA Netlist Writer的原因
  16. 餐饮服务设备行业的互联网趋势
  17. 怎么录制视频声音,什么录音软件好用
  18. 地图处理之基本使用汇总
  19. 重回南京 - 转自点妈文集
  20. 洛谷 | P1226 【快速幂】

热门文章

  1. Android 4.4 播放器,视频播放器(高清版)
  2. 6款良心本地视频播放器,功能强大还完全免费
  3. 老男孩Python高级全栈开发工程师【高清全套完整】
  4. javascript怎么对url进行编码转换
  5. html网页版国际象棋,棋友推荐的十五大国外国际象棋网站
  6. Arduino Uno - 控制4位8段共阴极数码管 显示数字
  7. 关于SI4463使用的个人总结
  8. iOS之 simlator模拟器截屏
  9. 【校招VIP】产品行测考察之逻辑推理
  10. SpringBoot2.2.X整合ElasricSearch7.8