• Sábado 18 de Mayo de 2024, 10:44

Autor Tema:  Crear un filtro a partir de un espectro  (Leído 2827 veces)

elejazz

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Crear un filtro a partir de un espectro
« en: Miércoles 14 de Julio de 2010, 19:39 »
0
Hola,

tengo que hacer un filtro, con una forma determinada, es decir que no sea ni pasabajo, alto ni banda...

A través de una funcion sinusoidal hago la transformada de fourier para obtener su espectro, y el resultado (la forma) de ese espectro es lo que yo debo convertir en filtro.

Me han comentado que provase con "fdesign.arbmag" ... pero no se como empezar


Teneis alguna idea sobre filtros para explicarme? me aconsejáis alguna alternativa o como utilizar la funcion que he escrito arriba ??


Cualquier cosa sera muy agradecida.

Humphrey

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Crear un filtro a partir de un espectro
« Respuesta #1 en: Miércoles 21 de Julio de 2010, 20:09 »
0
Buenas,

Si ya tienes la forma del espectro es muy fácil, utiliza la funcion fir2. En ella solo tienes que poner el orden del filtro que quieres y muestrear la respuesta en frecuencia (importante entre 0 y 1) y su amplitud correspondiente.

Espero que sea de ayuda. Yo la he usado alguna vez, si tienes dudas busco el script que hice en su día.

Humphrey

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Crear un filtro a partir de un espectro
« Respuesta #2 en: Lunes 26 de Julio de 2010, 07:42 »
0
Buenas elejazz, prefiero contestar por aqui:

El script lo tenia en el ordenador, no se si es del todo correcto, seguramente se pueda hacer mucho más limpio e incluso haya alguna función para hacer esto, pero bueno:

frec= linspace(0,length(IR),500); % Tomo 500 muestras de todo mi espectro. IR es mi vector con respuesta en frecuencia
frec= round(frec);        % redondeo para que no de problemas
frec1= frec/max(frec);          % Normalizar a 1
frecA= [1 frec(2:end)];         % frecuencias. Cogo desde 2 hasta el final, para no coger el indice 0, que me daría error a
                                           la hora de buscarlo en el vector
Amp=IR(frecA);                  % Amplitud
B=fir2(250,frec1,Amp);          % coeficientes del filtro

Ya te digo, es una idea. Seguro que hay alguien por aqui que lo puede mejorar.

Espero que te sirva.

elejazz

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re: Crear un filtro a partir de un espectro
« Respuesta #3 en: Martes 3 de Agosto de 2010, 15:52 »
0
Hey, muchas gracias Humphrey

eso seguro que es lo que necesito, lo he estado provando pero no logro obtenerlo con exactitud...
te pongo mi ejemplo a ver si me puedes ayudar:
(te recuerdo mi objetivo, tengo la funcion s  que crea un sonido con determinados armonicos, y a partir de la cual quiero diseñar mi filtro
por eso hago la transformada, la paso a frecuencias y opero segun tu me diciste,... para luego poder filtar algun archivo de audio)



fm=44100;  %frecuencia de muestreo (para audio)
fp=440;      %frecuencia fundamental del sonido
w=2*pi*fp
d=4.0;          % duracion en segundos
t=0:1/fm:d;  % Vector de tiempo

%%%% esta es la funcion que me crea el sonido con sus armonicos
s = sin(w*t) + 0.7*sin(3*w*t) + 0.2*sin(7*w*t) + 0.6*sin(9*w*t) + 0.3*sin(11*w*t);

[X,Fs,NBITS]=wavread('NOTAa440.wav');   %leo el .wav que quiero filtrar ... supongo que se guarda en X

% -----------------------> parte del codigo tuyo

IR=fft(s)
frec= linspace(0,length(IR),500);    % Tomo 500 muestras de todo mi espectro. IR es mi vector con respuesta en frec
frec= round(frec);       % redondeo para que no de problemas
frec1= frec/max(frec);   % Normalizar a 1
frecA= [1 frec(2:end)];   % frecuencias. Cojo desde 2 hasta el final, para no coger el indice 0
Amp=IR(frecA);              % Amplitud

B=fir2(250,frec1,Amp); % coeficientes del filtro
%B = fdesign.arbmag(250,frec1,abs(Amp)); %es otra opcion de diseñar un filtro (que de momento no se utilizar)

%---------------------> A PARTIR DE AQUI ES DONDE TENGO DUDAS

plot(frec1,Amp);  % con eso debería ver la forma del filtro, pero NO se parece con el espectro de la señal "s"

final=conv(B, X);  %supongo que es la manera valida de filtrar una vez creado el filtro, o mejor con la funcion "filter" ??
soundsc(final,fm);



----------------------> pero me salen estos errores (que yo sepa A y B que es la X, ya son vectores... que problema hay??)
??? Error using ==> conv
A and B must be vectors.

Error ==> at 42
final=conv(B, X);
---------------------> crees que es como lo devo hacer??  o lo tengo que hacer de otra forma para conseguir mi objetivo?



saludos ;)

Humphrey

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Crear un filtro a partir de un espectro
« Respuesta #4 en: Miércoles 4 de Agosto de 2010, 12:05 »
0
Buenas,

He estado mirando y creo que esta bien.
Prueba esto:
% A mi si que se me parecen:
plot(abs(IR))
figure; plot(frec1,abs(Amp));
figure; freqz(B) % este es el que menos se parece, probablemente por lo cercano que estan los picos en el espectro
                    % puedes probar utilizando una frecuencia más alta para
                    % que esten más separados.
                   
% yo utilizaría la función filter
y= filter(b,1,x);

Espero que te sirva de algo.

elejazz

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re: Crear un filtro a partir de un espectro
« Respuesta #5 en: Miércoles 4 de Agosto de 2010, 13:06 »
0
Sisi, luego lo vi, que lo que me faltava era pasarlo a valor absoluto "abs( )"

Pero lo de la funcion filter, por que se pone el 1 al segundo parametro?


muchas gracias por todo :-)

Humphrey

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Crear un filtro a partir de un espectro
« Respuesta #6 en: Jueves 5 de Agosto de 2010, 11:02 »
0
Buenas,

LA función filter se utiliza para filtros IIR y FIR.
Si pones 1 en el 2º parámetro es una forma de decirle que tienes un filtro FIR, y en 1º parámetro introduces los coeficientes de tu filtro.

Espero que sea de ayuda. YA comentarás si has solucionado tus problemas.