Creo que freqz en una caja de herramientas de MATLAB, es la forma de obtener DTFT de secuencia. freqz puede calcular la respuesta de frecuencia de:

H (z) = (Num) / (Den)

Podemos calcular fácilmente la transformación z de cualquier secuencia finita x(n) de esta manera:

H (z) = x (0) z ^ 0 + x (1) z ^ 1 + …

Sabemos en la expresión anterior que Den, es 1.

Recordando que: freeqz(num,den,n) da la respuesta al escalón en n puntos. Por x sea vector de x (n),

[x1freqz, x1freqzw]=freqz(x,1,3000,"whole"); 

debe darnos la DTFT.

1) ¿Es (declaración anterior) ¿correcto? que pasa si cambiamos nuestro polinomio ?? ¿por qué?

La segunda forma es calcular la fórmula DTFT completamente, así:

[X, W]=me_dtft(x1",pi,3000); figure title("my") % plot(W/pi,20*log10(abs(X))); plot(W/pi,abs(X)) ax = gca; % ax.YLim = [-40 70]; xlabel("Normalized Frequency (\times\pi rad/sample)") ylabel("Magnitude (dB)") function [X, w]=me_dtft(x,whalfrange, nsample) w= linspace(-whalfrange,whalfrange,nsample); t=0:1:size(x,2)-1; X=zeros(1,size(w,2)); for i=1:1:size(w,2) X(i)=x*exp(-t*1i*w(i))"; end end 

2) Estoy confundido, ¿es el rango de parámetro t en el código anterior, ¿es importante?

3) ¿Es correcta esta implementación? ¿Por qué?

Creo que debe haber disonancia, ya que la imagen: ingrese la descripción de la imagen aquí ¡Diciéndonos algo mal! Estas transformadas se toman de la onda sinusoidal pura (su código en la imagen), desde la derecha puede ver el fft, freqz por el manera explicada arriba y (izquierda) la DTFT como se explicó anteriormente.

Editar después del comentario de «Jason R»: Ok, también eliminé la escala logarítmica, ya que me confunde. Después de eso, intuitivamente tu eres iguales, como puede ver en la siguiente imagen, pero ¿por qué no son exactamente iguales (consulte la última imagen por escala logarítmica?)? ingrese descripción de la imagen aquí

freqz:

[x1freqz, x1freqzw]=freqz(fliplr(XX"),1,3000,"whole"); figure title("freqz") % plot((x1freqzw/pi)-1,20*log10(abs(fftshift(x1freqz)))) plot((x1freqzw/pi)-1,abs(fftshift(x1freqz))) ax = gca; % ax.YLim = [-40 70]; ax.XTick = -1:.5:2; xlabel("Normalized Frequency (\times\pi rad/sample)") ylabel("Magnitude") 

Ejemplo de seno:

Fs=1000; Ts=1/Fs; time=0:Ts:1; Freqs=500; Xs=zeros(length(Freqs),length(time)); for i=1:length(Freqs) Xs(i,:)= cos(2*pi*Freqs(i)*time); end XX=Xs; XX=XX./ max(abs(XX)); figure;plot(time, XX); axis(([0 time(end) -1 1])); xlabel("Time (sec)"); ylabel("Singal Amp."); title("A sample audio signal"); sound(XX,Fs) 

Comentarios

  • Debes publicar un script completo que genere los gráficos que dado.
  • Una diferencia es que veo que en su código está trazando la DTFT de -fs / 2 a + fs / 2 mientras que la FFT va de 0 a fs en comparación. (Pero puede usar » fft shitt «) Sin ver todo su código, sospecho que la diferencia en las dos gráficas es un error de redondeo que se reduciría al incluir más puntos o ir a flotadores de doble precisión. Tenga en cuenta que la DTFT será una función Sinc de la cual la FFT será muestras, a menos que cree una onda sinusoidal con una frecuencia que sea un submúltiplo entero de la frecuencia de muestreo. También sepa que puede obtener muestras de DTFT rellenando con ceros la FFT.
  • @DanBoschen en fft figure, 1000 significa fs / 2?
  • No 1000 significa fs, su forma de onda está en fs / 2
  • @DanBoschen ¿Puede explicar más por qué (mi DTFT y frecuencia, quiero decir) no son exactamente iguales? Si relleno el fft, ¿aparecerá sinc?

Responder

La función linspace como se usa va desde – fs / 2 a + fs / 2 para 3000 muestras, por lo que + fs / 2 se cuenta dos veces. Por el contrario, FFT y freqz, que van de 0 a N-1, no duplican los dos puntos finales (en este caso van de DC a 1 bin menos que fs donde fs es la frecuencia de muestreo). Por lo tanto, las ubicaciones de las muestras no son exactamente las mismas, lo que conduce a la diferencia observable en los dos métodos de frecuencia.

Además, puede obtener muestras de la DTFT mediante el relleno de ceros como otra opción: fft (x, 3000).

En lugar de linspace, que funcionará bien si eliges el inicio y la parada adecuados, me gusta hacer:

t = [0: length (x) -1] * 1 / fs

Comentarios

  • Sí, para responder a su segunda pregunta, creo que su enfoque es correcto. Una vez que arregle las ubicaciones de muestra, los resultados deberían coincidir
  • Que ‘ s funcionó bastante bien, pero mi segunda pregunta fue: 2) Estoy confundido, ¿es el rango de parámetro t en el código anterior, ¿importante?
  • Ah, ya veo — Bueno, el rango de t es el número de muestras. Anuló las 512 muestras predeterminadas en frecuencia para que sean 3000, por ejemplo, lo que le dio más muestras del mismo DTFT. Dicho esto, el rango no ‘ no cambia la respuesta para las muestras que elija, pero le brinda más muestras en sus resultados. Por ejemplo, incluso en su caso en el que tuvo dos respuestas diferentes porque las muestras tenían valores t ligeramente diferentes, en ambos casos estaba viendo la misma DTFT, solo ubicaciones ligeramente diferentes en la misma curva (continua). (La DTFT es una función continua de frecuencia).
  • Creo que explicaste el parámetro w, no t, ¿No es ‘ eso? t debe anular los índices de señal de tiempo, pero el índice puede funcionar por separado de t en el exponencial.podemos usar diferentes t como se usa en el índice de nuestra señal, en un mejor esquema podemos cambiar ese rango antes de calcular exponencial, lo que ‘ ¿Es el ‘ s impacto?
  • En su fórmula, t debe tener la misma longitud que x. Si aumenta el número de muestras en t, debe tener más muestras en x, lo que significa más precisión de frecuencia en su DTFT (el patrón Sinc que ve en la frecuencia tendrá nulos más cercanos). Cuando el número de muestras en x, ty la frecuencia coinciden, está calculando la DFT (aunque el camino largo se compara con la FFT, por lo que una FFT con relleno de ceros sería un enfoque mucho más eficiente para calcular muestras de la DTFT, o simplemente use freqz como lo ha hecho)

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *