Matlab - AYUDA CON FWRITE, please

 
Vista:

AYUDA CON FWRITE, please

Publicado por Edmundo Tapia (1 intervención) el 12/07/2006 18:38:22
Hola, tengo un código que baje de internet que es un compresor de voz en sub - bandas, todo funciona perfecto, excepto que no guarda el archivo comprimido en wav, solo lo grafica. quisiera saber como puedo hacer que se grabe la variable de salida en un archivo wav, me dijeron que con fwrite porque, en este caso, queda en la variable "salida" (que es un vector columna).

Alguna ayuda porfavor, si no me jalan en ese curso de Procesamientro de Señales

aca les va el codigo

GRACIAS DE ANTEMANO POR SU AYUDA, OJALA ME PUDIERAN ESCRIBIR A
[email protected]

% Programa compresor de voz en sub-bandas "cosubf.m"
%----------- Limpia las variables y guarda el path del archivo .WAV ----------------
clear;
[nombre,path]=uigetfile('.WAV','Por favor, seleccione el archivo a comprimir',100,100);
%---------------------- Abre y almacena el archivo .WAV ---------------------------
cd(path);
fid=fopen(nombre,'r');
archivo=fread(fid);
archwr=archivo;
[Y,Fs]=wavread(nombre);
disp('frecuencia de muestreo (Hz)');
disp(Fs)
largo_original=length(Y);
disp('largo (bytes) =');disp(length(Y));
sound(Y,Fs)
plot(archivo);
%-----------------------------------------------------------------------------------
%--------------------------- Creación de los filtros ------------------------------

for n=1:19 % Se crearan 19 filtros pasabanda.
fmin=200*n;
fmax=200+200*n;
[b,a]=ellip(4,0.01,100,[fmin fmax]*2/Fs); %Filtros pasabanda elipticos de 4to Orden de 200[Hz] de BW.
filpb(2*(n-1)+1,:)=b;
filpb(2*(n-1)+2,:)=a;
end;
archfil=filpb;
%--------------------------------------------------------------------------------------
archwr=archwr-128; % Se quita el nivel de señal continua.
[b,a]=ellip(4,.01,100,[500 4500]*2/Fs); % Filtro final pasabanda de 3.5 khz de BW aplicado a los datos filtrados por sub-bandas.
archwr=filtfilt(b,a,archwr);
%-------------------------------------------------------------------------------------------------------
fury=fft(archwr,1024); % Para poder observar el espectro de la señal original.
poty=fury.*conj(fury)/1024;
w=((0:511)/512 * Fs/2);
max_val=max(poty);
norm=poty/max_val;
plot(w,norm(1:512),'b');
xlabel('Frecuencia [Hz]');
ylabel('Potencia Normalizada');
title('Espectro de filtro pasabanda (rojo) y espectro de señal orginal (azul)');
hold on;
%-------------------------------------------------------------------------------------------------------
%-------------------------------------------------------------------------------------------------------
[h,w]=freqz(b,a,512); % Para poder observar el filtro pasabanda de 3.5 khz de BW.
plot(w*Fs/(2*pi),abs(h),'r');
zoom on;
%-------------------------------------------------------------------------------------------------------
nv = fix(length(archwr)/882)+1; % Divide el archivo en "nv" ventanas de tiempo.
for v=1:nv
progreso=(100*v)/nv
dinic=(((882*v)+1)-882);
dfinal=882*v;
if v==nv
dfinal=length(archwr);
end;
ventana=archwr(dinic:dfinal);
ventfourier=fft(ventana,1024); % Obtiene el espectro de la ventana.
potencia=ventfourier.*conj(ventfourier)/1024;
w=((0:511)/512 * Fs/2);
potmax=max(potencia(2:511,1)); % Encuentra la maxima potencia dentro la ventana de tiempo, para designar la frecuencia fundamental.
if potmax<=10 % Si la potencia maxima es menor que diez...
indice=0; % ...se aproxima a cero.
else
indice=find(potencia(2:511,1)==potmax); % Se busca la frecuencia fundamental de la ventana.
end;
%-------------------------------------------------------------------------------------------------------
%subplot(2,1,1);plot(ventana); % Para poder observar la señal en la ventana de tiempo.
%subplot(2,1,2);plot(w,potencia(1:100)); % Para poder observar las potencias espectrales de la ventana.
%axis([0 12000 0 100]);
%pause;
%-------------------------------------------------------------------------------------------------------
ffund=w(indice+1);
salida(20*v-19,1)=round(ffund);
if ffund==0 % Si la frecuencia fundamental de la ventana de tiempo es cero ....
for n=1:19
salida((20*v-19)+n,1)=0; % ... la ventana tiene una salida de valores cero.
end;
else
for n=1:19
vfil=filtfilt(archfil(2*(n-1)+1,:),archfil(2*(n-1)+2,:),ventana); % Se filtra en sub-bandas la ventana de tiempo.
largo=length(vfil);
salida((20*v-19)+n,1)=mean (abs (vfil)); % Se obtiene el valor absoluto de las potencias de cada sub-banda dentro de la ventana de tiempo.
end;
end;
end;

sal=size(salida);
sal_largo=sal(1,1);
compresion=100 - ((100*sal_largo)/largo_original);
disp('% de Compresion');disp(compresion); % Muestra el porcentaje de compresion.
fwrite(archwr,44100,8,'comp');
nv
sal_largo

% ACA TERMINA EL PROGRAMA,
GRACIAS POR SU AYUDA
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

RE:AYUDA CON FWRITE, please

Publicado por Edgar Muñoz (62 intervenciones) el 13/07/2006 01:24:39
Para archivos wav es mejor utilizar la función wavwrite, tienes que pasarle ciertos argumentos como la frecuencia de muestreo y algunos otros.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar