目前在做个超声波方便的东西,就是计算固定的距离的两点之间超声波的传播时间,因为我以前也没学过自适应滤波的知识,matlab也不怎么懂,所以现在就碰到一些困难。
附件是我用来仿真的一个MATLAB程序,这是参考自适应滤波程序来的,程序就存在问题,对LMS自适应时延估计算法里 for 循环的编写不怎么明白,还有输出的权值w是一个多维的矩阵,那怎么来求峰值时刻呢?还有对信号插值,插值后数据的计算,比如说时间间隔是1ms,但是我要到us级的精度,插值后怎样来按us间隔来计数?期望师兄师姐们帮我看看程序,指导我!期待你的回复!万分感激!
程序:
% 该程序参考时域LMS算法(用统计的方法仿真得出不同步长下的收敛曲线),计算信号之间的时延
clear % 清空变量空间
close all
g=100; % 统计仿真次数为g
N=1024; % 输入信号抽样点数N
k=128; % 时域抽头LMS算法滤波器阶数
u=0.001;
for q=1:g
n=1:N;
a=1;
s1=a*sin(0.05*pi*n); % 输入单频信号s1 周期为40
s2=a*sin(0.05*pi*(n-22)); % 输入时延后的单频信号s2,时延为90
%时域波形
figure(1);
subplot(211)
plot(n,real(s1)); % 信号s1时域波形
title('信号s1时域波形');
xlabel('n');
ylabel('s1');
axis([0,N,-a-1,a+1]);
subplot(212);
plot(n,real(s2));
title('信号s2时域波形'); % 信号s2时域波形
xlabel('n');
ylabel('s2');
axis([0,N,-a-1,a+1]);
%采样
n_interp=1:0.001:N; %插值后要保持数据的长度一致
s1_interp=interp1(n,s1,n_interp,'spline');
s2_interp=interp1(n,s2,n_interp,'spline');
% 设置初值
y=zeros(N,1); % 输出信号y
%y(1:k)=s1(1:k); % 将输入信号xn的前k个值作为输出y的前k个值
w=zeros(k,N); % 设置抽头加权初值
e=zeros(N,1); % 误差信号
x=zeros(k,1);
% 用LMS算法迭代滤波
for i=1:N-1
x=s1(i:-1:i-k+1); %这行命令存在问题
y(i)=w(1:k,i)'*x;
e(i)=s2(i)-y(i);
w=w+u*e(i)*s1;
end
end
figure(2);
subplot(211);
plot(e)
title('误差收敛情况')
subplot(212);
plot(w)
title('权值信号')
axis([0,k,-0.5,0.5])
[C,I]=max(w);
I
%for b=1:N-k
%bi(b)=sum(pp(:,b))/g; % 求误差的统计平均
%end
%figure(3); % 算法收敛曲线
%n=1:N-k;
%plot(n,10*log10(bi));
%hold off % 将每次循环的图形显示结果保存下来
[本帖最后由 cwjy 于 2010-5-22 20:24 编辑]
2010-5-22 16:46 上传
点击文件名下载附件
1.71 KB, 下载次数: 22426