¿Cómo hago para alias intencionalmente una señal, y para aumentar el muestreo con el archivo de audio en MATLAB?

5

Mi objetivo es mostrar los resultados de:

  
  • ¿Cómo hago para alias intencionalmente una señal?
  •   
  • submuestreo
  •   
  • tasa de Nyquist muestreo y sobremuestreo
  •   

Primero voy a hacer que el código MATLAB funcione bien, luego lo reescribiré para el MSP430.

Primero necesito reducir la muestra del archivo .wav para obtener un flujo de datos incompleto o imparcial que luego pueda reconstruir. Aquí el diagrama de flujo:
analógico - > filtro analógico de muestreo - > ADC - > remuestrear hacia abajo - > volver a muestrear - > DAC - > filtro analógico de reconstrucción

Este es mi primer proyecto de procesamiento de señales usando MATLAB (v2010), así que sé bueno. Código original abajo; Código actualizado aquí .

    %Play decimated file ( soundsc(y,fs) ) 
%Play Original file ( soundsc(play,fs ) )
%Play reconstucted File ( soundsc(final,fs) )

[piano,fs]=wavread('piano.wav'); % loads piano
play=piano(:,1); % Renames the file as "play"

t = linspace(0,time,length(play));          % Time vector
x = play;
y = decimate(x,25);

stem(x(1:30)), axis([0 30 -2 2])   % Original signal
title('Original Signal')
figure
stem(y(1:30))                        % Decimated signal
title('Decimated Signal')

%changes the sampling rate

fs1 = fs/2;
fs2 = fs/3;
fs3 = fs/4;
fs4 = fs*2;
fs5 = fs*3;
fs6 = fs*4;

wavwrite(y,fs/25,'PianoDecimation');


%------------------------------------------------------------------

%Downsampled version of piano is now upsampled to the original
[PianoDecimation,fs]=wavread('PianoDecimation.wav'); % loads piano
play2=PianoDecimation(:,1); % Renames the file as "play

%upsampling
UpSampleRatio = 2;  % 2*fs = nyquist rate sampling
play2Up=zeros(length(PianoDecimation)*UpSampleRatio, 1);
play2Up(1:UpSampleRatio:end) = play2; % fill in every N'th sample

%low pass filter

ResampFilt = firpm(44, [0 0.39625 0.60938 1], [1 1 0 0]);


fsUp = (fs*UpSampleRatio)*1;
wavwrite(play2Up,fsUp,'PianoUpsampled');

%Plot2
%data vs time plot
time=(1/44100)*length(play2);
t=linspace(0,time,length(play2));
stem(t,play2)
title('Upsampled graph of piano')
xlabel('time(sec)');
ylabel('relative signal strength')



[PianoUpsampled,fs]=wavread('PianoUpsampled.wav'); % loads piano
final=PianoUpsampled(:,1); % Renames the file as "play"


%-------------------------------------------------------------
%resampleing
[piano,fs]=wavread('piano.wav'); % loads piano
x=piano(:,1); % Renames the file as "play"
m = resample(x,3,2);

**%this is were i would need to sample it at the different frequecys (both above and below and at) nyquist frequency.*I think.***

soundsc(left,fs) % shows the resaultant audio file , which is the same as original ( only at or above nyquist frequency however) 

¿Cómo puedo mejorar esto? ¿Cómo muestro en diferentes frecuencias?

Note que he cruzado esto en SO, here .

    
pregunta Martin

2 respuestas

3

Si desea reducir la muestra de una manera que produzca aliasing, simplemente deseche una fracción de las muestras, es decir, mantenga solo cada 2ª muestra, etc.

Si desea reducir la muestra de una manera que no sea un alias, preceda a la reducción con un filtro de paso bajo que tenga un corte por debajo de la frecuencia nyquist de la frecuencia de muestreo que tendrá después de que finalice el proceso. Ya que diezmar implica tirar muestras y un filtro de paso bajo FIR no depende en el futuro de sus resultados, no tiene que molestarse en hacer un producto de punto de convolución para las salidas que solo descartaría en la decimación, en lugar de eso, simplemente puede saltar al siguiente.

Para aumentar la muestra, inserte ceros entre las muestras de entrada (use ceros, no repita los valores de entrada). Esto produce frecuencias de alias, así que siga con un filtro de paso bajo por debajo de la tasa nyquist de la frecuencia de muestreo original. Nuevamente, puede diseñar el cálculo de convolución para omitir las entradas de cero.

Para proporciones enteras pequeñas de frecuencias de muestreo, el descarte o la inserción de cero y los filtros FIR funcionan muy bien. Para proporciones más grandes, se pueden preferir los filtros CIC, ya que se pueden calcular de manera eficiente en hardware mediante el ajuste de cálculo binario (intencionalmente dejas que los cálculos se desborden), aunque tienen una respuesta de frecuencia en forma de función en lugar de una respuesta de frecuencia rectangular y, por lo tanto, necesitan una limpieza filtre para seleccionar solo el área rectangular cerca de la punta de la respuesta sinc y / o compense la caída de la sinc.

    
respondido por el Chris Stratton
3

Voy a empezar de manera simple y a construir.

F= Frequency

F(Hz=1/s) E.x. 100Hz = 1000 (Cyc/sec) F(s)= 1/(2f)

Example problem: 1000 hz = Highest frequency 1/2(1000hz) = 1/2000 = 
5x10(-3) sec/cyc or a sampling rate of 5ms

Si su frecuencia más alta es 1000Hz y muestra con un período de 5 ms (500 Hz), su señal ya ha perdido una gran cantidad de su información. Estás muestreando a 1/4 de la tasa de nyquist. Para una onda de 1000Hz, debe muestrear al menos 2000Hz, y eso está en un mundo perfecto. Realmente necesitas ir un poco más rápido debido a las limitaciones de la tecnología, pero esto va más allá de lo que necesitas saber.

¿Cuál es mi frecuencia de nyquist?

Espera, te refieres a Nyquist Frequency o Nyquist rate ?

Probablemente esto parezca una distinción bastante trivial, pero muchas personas hacen referencia a cosas diferentes cuando cambian de términos, algunas personas pueden controlar la "tasa de símbolos", algunas pueden controlar la "tasa de muestreo" y otras pueden controlar ambas (ingenieros afortunados) .

Debe muestrear a una frecuencia que sea mayor que el doble de su frecuencia más alta .

Si va por debajo de este, su señal tendrá un alias, esto es irreversible una vez que sucedió, lo mejor que puede hacer es filtrar la parte dañada de su señal, pero esto no recupera la información, solo elimina las frecuencias dañadas.

Downsampling in Matlab

Digamos que tiene su señal, evitó los alias y desea reducir la muestra a la mitad de los puntos. Esto es muy fácil en matlab. Eche un vistazo a la función de reducción . Esto manejará el desorden de asegurarse de que su muestreo descendente no introduzca el alias, a un costo. Cuando filtra las frecuencias más altas, se pierden. Esto es lo que pides cuando la mitad de tus puntos de datos. Solo puede utilizar la función de reducción de muestras . Si tienes las frecuencias más altas, será alias. Si sabe que no debería haber esas frecuencias allí, siempre puede usar diezmar para asegurarse de que el ruido no se introduzca en su sistema.

Me gustaría entrar en más detalles, pero tuve que acortarme ya que estoy fuera de tiempo para hoy. Déjame un comentario si hay más que te ayuden, y volveré y agregaré más información. Estoy seguro de que no cubrí todo lo que querías.

    
respondido por el Kortuk

Lea otras preguntas en las etiquetas