% 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;