Demonstrando o efeito do alias

7

Como o sinal fica quando não usamos a taxa de Nyquist para remover o alias de um sinal durante a amostragem?

Vamos supor que o sinal seja sinusoidal, com uma frequência de 500 Hz e uma amplitude de 2.

signal = 2*cos(2*pi*500*t)

Se eu fizer a amostragem (substituindo t = nTs, Ts = período de amostragem en representa o número de amostras) e plotar os sinais amostrados com um período de amostragem diferente usando o comando subplot no MATLAB, como identificar o alias em um sinal amostrado?

Aqui está o código de exemplo que plotou dois sinais, um na taxa de Nyquist e outro menor que na taxa de Nyquist:

A = 2;
Fmax = 10;
Fs = 2*Fmax;
n = 0:1/Fs:1;
Cont = A*sin(2*pi*(Fmax/Fs)*n);
Cont1 = A*sin(2*pi*(Fmax/18)*n);
subplot(2,1,1)
stem(n,Cont)
hold on
stem(n,Cont1)

e aqui está a forma de onda:

Digite a descrição da imagem aqui

Não consegui identificar o alias. Como isso afetou o sinal quando a taxa de Nyquist não foi usada?

Sufiyan Ghori
fonte
Devido a um erro, seu exemplo não foi, de fato, amostrar abaixo da metade da frequência do seu sinal de teste. Tente amostrar um sinal de 1 MHz a 1 Hz.
precisa saber é o seguinte

Respostas:

8

Você não pode identificar o aliasing com um sinusóide simples em uma frequência específica e, de certa forma, esse é o objetivo de tentar evitá-lo. Você não pode saber se o senoide para o qual está "olhando" éQ Hz ou 2Fs-QHz.

Um único componente sinusoidal com alias se parece com um sinusóide sem alias. Se você quiser experimentar o alias, precisará tentar com uma forma de onda mais complexa ou com um senoide que está mudando com o tempo.

Uma maneira de "experimentar o aliasing" é subamostrar um chilro da seguinte maneira:

Fs = 8000;t=0:(1./Fs):(5-1./Fs);p=2.*pi.*t; %Sampling Frequency, Time Vector, Phase Vector
y1 = chirp(t,0,5,Fs/2.0); %Create a chirp that goes from DC to Fs/2.0
spectrogram(y1); %Have a look at it through spectrogram, please pay attention at the axis labels. This is basically going to be a "line" increasing with time.
soundsc(y1,Fs); %Listen to it...It clearly "goes up" in frequency
y2 = chirp(t,0,5,Fs); %Now create a chirp that goes from DC to Fs
spectrogram(y2); %Have a look at it through spectrogram
soundsc(y2,Fs); %Listen to it...Do you "get" the folding of the spectrum?

Em geral, você pode pensar em Amostragem como Modulação, porque é isso que está efetivamente acontecendo na amostra e mantém o elemento de um conversor ADC.

Isso permitirá que você entenda com mais facilidade conceitos como subamostragem, por exemplo (e aplicativos onde é perfeitamente aceitável amostrar em taxas mais baixas que as taxas de Nyquist). Mas também é possível carregar um arquivo WAV no MATLAB (com 'wavread') contendo algum sinal mais complexo e antes de ouvi-lo com 'soundsc', basta multiplicá-lo com uma onda "quadrada" * (você pode querer procurar a função 'square') com alguma frequência menor que a do arquivo WAVFs. Isso introduzirá efetivamente a característica chave (indesejada) do aliasing, que é essa dobra do espectro . O resultado não é muito agradável, portanto, você pode manter o volume dos alto-falantes baixo.

Eu espero que isso ajude.

* EDIT: Obviamente, "square" retorna um quadrado com uma amplitude no intervalo [-1,1], portanto, antes de multiplicá-lo com seu sinal, seria melhor redimensioná-lo como:

aSquareWave = (square(100.*p)+1.0)/2.0 % Where p is the phase vector and here we are producing a square wave at 100Hz (given an Fs of 8kHz as above). aSquareWave's amplitude is now in the interval [0,1]
A_A
fonte
6

Você tem a ideia certa, mas um erro importante foi atrapalhar seus resultados.

n=0:1/Fs:1;

Fazendo o tempo aumentar 1 / Fs, você está implicitamente fazendo as unidades de tempo segundos. Em outras palavras, "0" é 0 segundos e "1" é 1 segundo.

Cont = A*sin(2*pi*(Fmax/Fs)*n);

Ao normalizar a frequência senoidal por Fs, você assume implicitamente que a unidade de amostra é 1 / Fs segundos. É por isso que você estava recebendo muitas amostras para um único ciclo senoidal quando pretendia ter apenas duas amostras por ciclo (a taxa de Nyquist). A propósito, qualquer unidade de amostra é boa (1 segundo ou 1 / Fs segundo), você só precisa ser consistente.

Aqui está minha tentativa do que eu acho que você pretendia.

A = 2;
Fmax = 10;
Fs = 2*Fmax;
n=0:1/Fs:1;
Cont = A*cos(2*pi*Fmax*n);
Cont1 = A*cos(2*pi*Fmax*(20/18)*n);
subplot(2,1,1)
stem(n,Cont)
subplot(2,1,2)
stem(n,Cont1)

Mudei o "pecado" para "cos" porque estava atingindo todos os zero pontos sinusóides em vez dos picos. insira a descrição da imagem aqui

Jim Clay
fonte
0

Eu acho que você precisa aumentar a frequência do tamanho ou usar etapas muito maiores na amostragem.

O alias não aparece se você tiver uma função muito suave. Por exemplo, uma função constante não produz aliasing, seja qual for a amostragem usada.

Libor
fonte