Diferentes Ejemplos con yule-walker___Welch____MUSIC

Anuncio
% Ejemplo 1
% El Programa evalua diferentes mestodos espectrales modernos
% Se genera el espectro de un ruido filtrado por un pasabajas, sinusoides,
% y ruido. Entonces se aplica algunos metodos clasicos y el AR
%
npts = 1024;
% Tamaño de los datos
N = 8;
% orden del filtro
w = pi/20;
% frecuencia de corte
% Se calcula la respuesta al impulso de un filtro pasa bajas Butterworth
noise = randn(npts,1);
% Se genera ruido
[b,a] = butter(N,w);
% Filtramos el ruido con un filtro Butterworth
out = 5 * filter(b,a,noise);
[data,f,sig] = sig_noise([100 240 280 400],-16,npts);
% Genera datos sinusoidales
data = 4*data + out(1:1024,1)';
% Construye una señal con ruido agregado
sig = 4*sig + out(1:1024,1)';
% construye una señal sin ruido agregado
% DEP con Welch
[PS,f] = pwelch(sig, npts,[],[],1000);
subplot(3,2,1);
plot(f,PS,'k');
text(200,max(PS),'Welch');
xlabel('Frecuencia (Hz)');
ylabel('DEP');
axis([0 500 0 .5]);
% Aplicamos Welch a la señal con suido agregado
[PS,f] = pwelch(data, npts,[],[],1000);
subplot(3,2,2);
plot(f,PS,'k');
text(200,max(PS),'Welch');
xlabel('Frecuencia (Hz)');
ylabel('DEP');
axis([0 500 0 .5]);
% Aplicamos el modelo AR a la señal ruidosa cons tres diferentes ordenes
subplot(3,2,3);
[PS,f] = pyulear(data,17,npts, 1000);
plot(f,PS,'k');
text(200,max(PS),'Yule Walker p = 17');
xlabel('Frecuencia (Hz)');
ylabel('DEP');
axis([0 500 0 .12]);
subplot(3,2,4);
[PS,f] = pyulear(data,25,npts, 1000);
plot(f,PS,'k');
text(200,max(PS),'Yule Walker p = 25');
xlabel('Frecuencia (Hz)');
ylabel('DEP');
axis([0 500 0 .12]);
subplot(3,2,5);
[PS,f] = pyulear(data,35,npts,1000);
plot(f,PS,'k');
text(200, max(PS),'Yule Walker = 35');
xlabel('Frecuencia (Hz)');
ylabel('DEP');
axis([0 500 0 .12]);
% Aplicamos el metodo de la Covarianza
subplot(3,2,6);
[PS,f] = pmcov(data,25,npts, 1000);
plot(f,PS,'k');
text(200,max(PS),'Covarianza p = 25');
xlabel('Frecuencia (Hz)');
ylabel('DEP');
axis([0 500 0 .12]);
% Ejemplo 2
% Programa para evaluar diferentes técnicas espectrales
% con el objetico de detectar una señal de banda agosta con
% diferentes niveles de ruido
clear all; close all;
N = 1024;
% Tamaño de la señal
fs = 1000;
% Frecuencia de muestreo
order = 15;
% Orden del modelo
noise = [0 -4 -9 -15];
% Definimos diferentes niveles de ruido en db
for i = 1:4
% Generamos dos componentes sinusoidales cercanos con ruido
x = sig_noise([240 280],[noise(i) noise(i)],N);
[PS,f] = pyulear(x,order,N,fs);
subplot(2,2,i);
plot(f,PS,'k');
text(200,max(PS),['SNR: ',num2str(noise(i)), 'db']);
xlabel('Frecuencia (Hz)'); ylabel('DEP');
end
% Ejemplo 3
% Compara los metodos espectrales: FFT, AR, e Eigenanalisis
close all; clear all;
N = 1024;
fs = 1000;
% Tamaño de la señal
% Frecuencia de muestreo
% Genera una señal de sinusoides con ruido
[x,t] = sig_noise([50 80 240 400],[-12 -12 -12 -12],N);
% Estima el espectro de Welch sin ventana ni traslape
[PS,f] = pwelch(x,N,[],[],fs);
subplot(2,2,1);
plot(f,PS,'k');
xlabel('Frecuencia (Hz)');
ylabel('DEP'); title ('Welch');
% Calcula el espectro con el metodo de la Covarianza modificada
subplot(2,2,2);
[PS,f] = pmcov(x,25,N,fs);
plot(f,PS,'k');
xlabel('Frecuencia (Hz)');
ylabel('DEP');
% Genera el espectro usando el metodo MUSIC
%
sin ventana, ni traslape
subplot(2,2,3);
[PS,f] = pmusic(x,20,N,fs,100,99);
plot(f,PS,'k');
xlabel('Frecuencia (Hz)');
ylabel('DEP '); title('Metodo MUSIC');
% Grafica los valores singulares de los eigenvectores
%
Usan una dimension grande para obtener un número grande de
%
coeficientes
subplot(2,2,4);
[PS,f,evects,svals] = pmusic(x,30,N, fs);
plot(svals,'k');
xlabel('Numero');
ylabel('Valores Singulares');
title('Valores Singulares');
% Ejemplo 4
% Se genera una señal con sinusoides y ruido
% Se compara Welch, AR e eigenvectores (MUSIC)
clear all; close all;
npts = 32; % Se usa un número pequeño de datos
[data, f, waveform,snr] = sig_noise([140 150],-6,npts);
disp(snr)
% Estimamos la DEP usando Weclch sin ventana ni traslape
[PS,f] = pwelch(data, npts,[],[],1000);
subplot(2,2,1);
plot(f,PS,'k');
text(100,max(PS),'Welch');
xlabel('Frecuencia (Hz)');
ylabel('DEP');
subplot(2,2,2);
[PS,f] = pmusic(data,3,npts, 1000);
plot(f,PS,'k');
text(100,max(PS),'Metodo con Eigenvectores (MUSIC) SS = 3');
xlabel('Frecuencia (Hz)');
ylabel('Espectro');
subplot(2,2,3);
[PS,f] = pmusic(data,5,npts,1000);
plot(f,PS,'k');
text(100, max(PS),'Metodo con Eigenvectores (MUSIC) SS = 6');
xlabel('Frecuencia (Hz)');
ylabel('Espectro');
subplot(2,2,4);
[PS,f] = pmusic(data,11, npts,1000);
plot(f,PS,'k');
text(100,max(PS),'Metodo con Eigenvectores (MUSIC) SS = 11');
xlabel('Frecuencia (Hz)');
ylabel('Espectro');
% Ejemplo 5
% Evaluación del eigenanalisis
% Generando los espectros de sinusoides con ruido
close all; clear all;
npts = 1024;
% Tamaño de la señal
order = 15;
% orden del modelo
noise = randn(npts,1); % Generamos ruido
% Calculamos la respuesta al impulso de un filtro pasabajas
[data,f,waveform,sig] = sig_noise([100 240 280 400],-16,npts);
% Estimacuon usando el metodo de Welch sin ventana ni traslape
[PS,f] = pwelch(data, npts,[],[],1000);
subplot(2,2,1);
plot(f,PS,'k');
text(200,max(PS),'Welch');
xlabel('Frecuencia (Hz)');
ylabel('DEP');
%axis([0 600 0 .5]);
subplot(2,2,2);
[PS,f] = pmcov(data,25,npts, 1000);
plot(f,PS,'k');
text(200,max(PS),'Covariance Modi p = 25');
xlabel('Frecuencia (Hz)');
ylabel('DEP');
subplot(2,2,3);
[PS,f] = pmusic(data,11,npts,1000);
plot(f,PS,'k');
text(200, max(PS),'Metodo MUSIC SS = 11');
xlabel('Frecuencia (Hz)');
ylabel('DEP');
subplot(2,2,4);
[PS,f,evects,svals] = pmusic(data,30,npts, 1000);
plot(svals(1:30),'k');
text(3,max(svals),'Valores singulares');
xlabel('Numero)');
ylabel('Valores singulares');
function [waveform_noise, time, waveform, snr_out] = sig_noise(freqsin, snr, npts);
% Funcion para generar sinusoides con ruido.
%
% freqsin
es un vector que especifica la frecuencia de las sinusoides
%
asumiendo una frecuencia de 1 KHz
%
una sinusoide de amplitud 1 es generada para cada
entrtada
% snr
es un vector que indica los valores de SNR en db de
%
cada una de las sinusoides
%
si snr es un escalar; entonces este valor es usado para todas las
frecuencias
% npts
numero de puntos en el arreglo
% waveform_noise es el vector de salida que contine las sinusoides con
%
ruido
% waveform
es la salida con unicamente las sinusoides
% time
es el vector tiempo utilizado para graficar
%
%
%
fs = 1000;
% Asumimos una frecuencia de muestreo de 1 kHz
Ts = 1/fs;
time = (0:(npts-1))*Ts;
noise = randn(1,npts);
% Generamos el ruido y calculamos el valor
rms_noise = sqrt(mean(noise.^2));
if length(snr) < length(freqsin) & length(snr) == 1
% Verifica la longitud del
vecto SNR
snr(2:length(freqsin)) = snr(1);
%si es un escalar se usa este valor para
todas las frecuencias
elseif length(snr) < length(freqsin)
disp('Error: not enough SNR values')
waveform_noise = rms_noise;
return
end
%
for i = 1:length(freqsin)
freq_scale = freqsin(i) * 2 * pi/fs;
x = (1:npts) * freq_scale;
snr_n = 10^(snr(i)/20);
% Convertimos de db
A = snr_n * rms_noise * 1.414; % Determinamos la ganancia para el apropiado SNR
if i == 1
component = sin(x) * A;
waveform = component;
rms_sig(i) = sqrt(mean(waveform.^2));
else
component = sin(x) * A;
rms_sig(i) = sqrt(mean(component.^2));
waveform = waveform + component;
end
snr_out(i) = 20 * log10(rms_sig(i)/rms_noise);
end
waveform_noise = waveform + noise;
Descargar