自适应滤波器 | 频域自适应滤波器(FLMS)
自适应滤波器
一、时域自适应线谱增强器
二、自适应滤波器 | 频域自适应滤波器
文章目录
- 自适应滤波器
- 前言
- 基本原理
- 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)相关推荐
- 频域自适应 matlab,频域自适应滤波算法及应用.doc
频域自适应滤波算法及应用 本科毕业设计 频域自适应滤波算法及应用 华 南 理 工 大 学 毕 业 设 计 (论文) 任 务 书 兹发给 级 班学生毕业设计(论文)任务书,内容如下: 1.毕业设计(论文 ...
- 新息自适应卡尔曼滤波matlab代码,基于新息协方差的自适应渐消卡尔曼滤波器
第33卷第12期 系统工程与电子技术 V01.33 No.12 2011年12月 Systems Engineering and Electronics 'December 2011 文章编号:i00 ...
- 新息自适应卡尔曼滤波matlab代码,基于新息协方差的自适应渐消卡尔曼滤波器.pdf...
第33卷第12期 系统工程与电子技术 V01.33No.12 andElectronics 'December2011 2011年12月 SystemsEngineering 文章编号:i001-50 ...
- 经典滤波器与现代滤波器
经典滤波器就是我们熟知的FIR和IIR,经典滤波器要求对输入信号的频率范围已知,从功能上可划分为: 低通滤波器(LPF) 高通滤波器(HPF) 带通滤波器(BPF) 带阻滤波器(BSF) 陷波滤波器( ...
- 有源滤波器和无源滤波器的区别?(硬件每日一题)
表面区别:一个要电源供电,一个不用 有源可以做的很小,集成,无源比较难 一个主要处理信号 一个常常在电源里使用-- 无源可以看成额外吸收谐波的负载,被动的吸收谐波:有源可以看成电源,主动的生成反向谐波 ...
- IIR滤波器和FIR滤波器的区别与联系
IIR滤波器和FIR滤波器的区别与联系_jinjun_新浪博客 http://blog.sina.com.cn/s/blog_6281182601019rst.html 1.两种滤波器都是数字滤波器 ...
- 滑动平均滤波器与CIC滤波器
文章目录 前言 一.传递函数 1.什么是传递函数 2.FIR与IIR在传递函数上的区别(FIR) 3.FIR与IIR在传递函数上的区别(IIR) 4.FIR的抽头系数/FIR的阶数 5.FIR滤波器的 ...
- matlab 多通道余弦调制镜像滤波器组_滤波器基础:抗混叠
电子万花筒平台核心服务 中国最活跃的射频微波天线雷达微信技术群 电子猎头:帮助电子工程师实现人生价值! 电子元器件:价格比您现有供应商最少降低10% 射频微波天线新产品新技术发布平台:让更多优秀的 ...
- 抽取_内插_半带滤波器_多相滤波器
文章目录 半带滤波器 多相抽取滤波器 多相内插滤波器 半带抽取器和半带内插器 参考资料:Xilinx FIR Compiler v7.2 LogiCORE IP Product Guide PG149 ...
- RC滤波器与LC滤波器详解(RC滤波器与LC滤波器区别,RC滤波器和LC滤波器工作原理和经典设计)
RC滤波器与LC滤波器详解(RC滤波器与LC滤波器区别,RC滤波器和LC滤波器工作原理和经典设计) [导读] LC滤波器应用的频率范围为1kHz-1.5GHz.由于受限于其中电感的Q值,频率响应的截至 ...
最新文章
- c++ 界面交互影响处理代码执行速度_原创 | 某SCADA的远程代码执行漏洞挖掘与利用...
- Spring之AOP由浅入深
- java使用xml存储数据_聊一聊 Redis 数据内部存储使用到的数据结构
- spark简介(大数据技术)
- logstash增量同步mysql数据到es
- Cocos2d-x动作CCAction
- ArcGIS属性字段名设置不超过四个中文的解决方法
- return、break、continue三者的区别
- imx6q LINUX 启动时间优化
- 按键精灵手机助手错误:at tempt to compare nu11 with number
- obj文件格式详解及示例
- R语言单因素分析案例
- html 倒计时毫秒,实现毫秒级倒计时
- 智真长老临别四句偈言 智深圆寂偈语
- 在quartus II15.0中调用Modelsim进行时序仿真时出现Rerun the EDA Netlist Writer的原因
- 餐饮服务设备行业的互联网趋势
- 怎么录制视频声音,什么录音软件好用
- 地图处理之基本使用汇总
- 重回南京 - 转自点妈文集
- 洛谷 | P1226 【快速幂】