PDA

查看完整版本 : [MATLAB信号处理] 基于MATLAB的谱估计和自适应程序 求助


zk542648265
2013-01-13, 12:53
以下为谱估计和自适应程序,哪位大神能帮我注解下程序的语句和告诉我流程图是什么?
clear;

clc;

%Burg Data leng N=64

clear;

clc;

N=1024;

n=[0:N-1];

randn('state',0);

wn=randn(1,N);

xn=sqrt(20)*sin(2*pi*0.1*n)+sqrt(20)*sin(2*pi*0.4*n)+wn;

ef(1,:)=xn;

eb(1,:)=xn;

tempsum=0;

for i=1:1:N

tempsum=tempsum+xn(i).*xn(i);

end

thegma(1)=tempsum/N;



%p=1

sum1=0;

sum2=0;

for n=2:N,

sum1=sum1+ef(1,n)*eb(1,n-1);

sum2=sum2+abs(ef(1,n))^2+abs(eb(1,n-1))^2;

end

a(1,1)=-2*sum1/sum2;

thegma(2)=(1-abs(a(1,1))^2)*thegma(1);

for n=3:N,

ef(2,n)=ef(1,n)+a(1,1)*eb(1,n-1);

eb(2,n)=eb(1,n-1)+a(1,1)*ef(1,n);

end



p=1;

IP=14;

while p<IP

p=p+1;

sum1=0;

sum2=0;

for i=p+1:N

sum1=sum1+ ef(p,i)*eb(p,i-1);

sum2=sum2+ef(p,i)*ef(p,i)+eb(p,i-1)*eb(p,i-1);

a(p,p)=-2*sum1/sum2;

end

thegma(p+1)=[1-(abs(a(p,p)))^2]*thegma(p);

for i=p+2:N

ef(p+1,i)=ef(p,i)+a(p,p)*eb(p,i-1);

eb(p+1,i)=eb(p,i-1)+a(p,p)*ef(p,i);

end

for k=1:1:p-1

a(p,k)=a(p-1,k)+a(p,p)*a(p-1,p-k);

end

end

b=[1,a(p,:),zeros(1,N-p-1)];

Pxx=abs(thegma(p))./((abs(fft(b))).^2);

Pxx=Pxx(1:N/2);

Pxx=10*log10(Pxx);

n=[0:N-1];

n=n(1:N/2);

% subplot(2,2,1);

plot(n/N,Pxx);

xlabel('Frequency');

ylabel('Power Spectrum (dB)');

title('Burg Data leng N=64');

grid on;




2、自适应的程序

clear all

close all

%channel system order

sysorder = 5 ;

% Number of system points

N=2000;

inp = randn(N,1);

n = randn(N,1);

[b,a] = butter(2,0.25);

Gz = tf(b,a,-1);

%This function is submitted to make inverse Z-transform (Matlab central file exchange)

%The first sysorder weight value

%h=ldiv(b,a,sysorder)';

% if you use ldiv this will give h :filter weights to be

h= [0.0976;

0.2873;

0.3360;

0.2210;

0.0964;];

y = lsim(Gz,inp);

%add some noise

n = n * std(y)/(10*std(n));

d = y + 3*n;

totallength=size(d,1);

%Take 60 points for training

N=60 ;

%begin of algorithm

w = zeros ( sysorder , 1 ) ;

for n = sysorder : N

u = inp(n:-1:n-sysorder+1) ;

y(n)= w' * u;

e(n) = d(n) - y(n) ;



if n < 20

mu=0.32;

else

mu=0.15;

end

w = w + mu * u * e(n) ;

end





%check of results

for n = N+1 : totallength

u = inp(n:-1:n-sysorder+1) ;

y(n) = w' * u ;

e(n) = d(n) - y(n) ;

end

hold on

plot(d)

plot(y,'r');

title('System output') ;

xlabel('Samples')

ylabel('True and estimated output')

figure

semilogy((abs(e))) ;

title('Error curve') ;

xlabel('Samples')

ylabel('Error value')

figure

plot(h, 'k+')

hold on

plot(w, 'r*')

legend('Actual weights','Estimated weights')

title('Comparison of the actual weights and the estimated weights') ;

axis([0 6 0.05 0.35])



% RLS 算法

randn('seed', 0) ;

rand('seed', 0) ;



NoOfData = 8000 ;

Order = 32 ;

Lambda = 0.98 ;

Delta = 0.001 ;

x = randn(NoOfData, 1) ;

h = rand(Order, 1) ;

d = filter(h, 1, x) ;



P = Delta * eye ( Order, Order ) ;

w = zeros ( Order, 1 ) ;



% RLS Adaptation



for n = Order : NoOfData ;



u = x(n:-1:n-Order+1) ;

pi_ = u' * P ;

k = Lambda + pi_ * u ;

K = pi_'/k;

e(n) = d(n) - w' * u ;

w = w + K * e(n) ;

PPrime = K * pi_ ;

P = ( P - PPrime ) / Lambda ;

w_err(n) = norm(h - w) ;



end ;



% Plot results



figure ;

plot(20*log10(abs(e))) ;

title('Learning Curve') ;

xlabel('Iteration Number') ;

ylabel('Output Estimation Error in dB') ;



figure ;

semilogy(w_err) ;

title('Weight Estimation Error') ;

xlabel('Iteration Number') ;

ylabel('Weight Error in dB') ;