signal muestreo grafica frecuencia example code algoritmo matlab fft

muestreo - Matlab FFT. Atascado la relación de comprensión entre la frecuencia y el resultado



grafica de fft en matlab (7)

Estamos tratando de analizar el flujo alrededor del cilindro circular y tenemos un conjunto de valores de Cp que obtuvimos del experimento del túnel de viento. Inicialmente, comenzamos con una frecuencia de muestreo de 20 Hz e intentamos encontrar la frecuencia de desprendimiento de vórtices utilizando FFT en matlab. Tenemos una frecuencia de alrededor de 7 Hz. A continuación, hicimos el mismo experimento, pero lo único que cambiamos fue la frecuencia de muestreo: de 20 Hz a 200 Hz. Obtuvimos la frecuencia del desprendimiento de vórtices en torno a los 70 Hz (aquí es donde se ubica el pico en el gráfico). El gráfico no cambia independientemente de los datos de Cp que ingresamos. El único momento en que el pico difiere es cuando cambiamos la frecuencia de la muestra. Parece que el aumento en la frecuencia del desprendimiento de vórtices es proporcional a la frecuencia de la muestra y esto no parece tener ningún sentido. Cualquier ayuda con respecto al establecimiento de una relación entre la frecuencia de la muestra y la frecuencia de desprendimiento de vórtices se vería muy apreciada.


El problema que está viendo está relacionado con el "aliasing de datos" debido a las limitaciones de la FFT para detectar frecuencias más altas que la Frecuencia Nyquist (la mitad de la frecuencia de muestreo).

Con el aliasing de datos, un pico en la frecuencia real se centrará alrededor (frecuencia real del módulo Nyquist). En su muestreo de 20 Hz (suponiendo que 70 Hz es la frecuencia real, que da como resultado una frecuencia cero, lo que significa que no está viendo la información real. Una cosa que puede ayudarlo con esto es usar "ventanas" de FFT).

Otro problema que puede experimentar está relacionado con la generación de datos ruidosos a través de la medición de FFT única. Es mejor tomar muchos datos, usar ventanas con solapamiento y asegurarse de tener al menos 5 FFT que promedia para encontrar el resultado. Como mencionó Steven Lowe, también debería probar a tasas más rápidas si es posible. Yo recomendaría tomar muestras al ritmo más rápido que sus instrumentos puedan muestrear.

Por último, recomendaría que leyera algunos extractos de Recetas numéricas en C (<- enlace):

No necesita leer el código fuente C, solo las explicaciones. Numerical Recipes for C tiene una excelente información condensada sobre el tema.

Si tiene más preguntas, déjelas en los comentarios. Trataré de hacer mi mejor esfuerzo al responderles.

¡Buena suerte!


esto probablemente no es un problema de programación, parece un problema de medición experimental

creo que la frecuencia de muestreo debe ser al menos el doble de la frecuencia de oscilación; de lo contrario, obtienes artefactos; esto podría explicar la diferencia. Tenga en cuenta que la relación de la frecuencia de FFT a la frecuencia de muestreo es de 0,35 en ambos casos. ¿Puedes repetir el experimento con tasas de muestreo más altas? Estoy pensando que si se trata de un cilindro estrecho con viento fuerte, puede estar vibrando / oscilando más rápido de lo que la velocidad de muestreo puede detectar.

Espero que esto ayude - hay un 97.6% de probabilidad de que no sé de lo que estoy hablando ;-)


Si no es un problema de aliasing, parece que podría estar trazando la respuesta de frecuencia en una escala de frecuencia normalizada, que cambiará con la frecuencia de la muestra. Aquí hay un ejemplo de una forma razonablemente buena de trazar una respuesta de frecuencia de una señal en Matlab:

Fs = 100; Tmax = 10; time = 0:1/Fs:Tmax; omega = 2*pi*10; % 10 Hz signal = 10*sin(omega*time) + rand(1,Tmax*Fs+1); Nfft = 2^8; [Pxx,freq] = pwelch(signal,Nfft,[],[],Fs) plot(freq,Pxx)

Tenga en cuenta que la frecuencia de muestreo se debe pasar explícitamente al comando pwelch para generar los datos de frecuencia "real". De lo contrario, cuando cambie la frecuencia de muestreo, el contenedor donde se produce la resonancia parecerá cambiar, lo cual es similar al problema que describe.


Intenté usar el código de respuesta de frecuencia como el anterior, pero parece que no tengo la caja de herramientas adecuada en Matlab. ¿Hay alguna manera de hacer lo mismo sin usar el comando fft? Hasta ahora, esto es lo que tengo:

% FFT Algorithm Fs = 200; % Sampling frequency T = 1/Fs; % Sample time L = 65536; % Length of signal t = (0:L-1)*T; % Time vector y = data1; % Your CP values go in this vector NFFT = 2^nextpow2(L); % Next power of 2 from length of y Y = fft(y,NFFT)/L; f = Fs/2*linspace(0,1,NFFT/2); % Plot single-sided amplitude spectrum. loglog(f,2*abs(Y(1:NFFT/2))) title('' y(t)'') xlabel(''Frequency (Hz)'') ylabel(''|Y(f)|'')

Creo que puede haber algo mal con el código que estoy usando. No estoy seguro de que sin embargo.


Me parece que necesita leer seriamente sobre el procesamiento digital de señales antes de que pueda comenzar a comprender todos los matices de la DFT (FFT). Si yo fuera tú, primero me basaría en este gran libro:

Procesamiento de señal de tiempo discreto

Si quieres más tratamiento matemático que realmente expanda tus habilidades,

Análisis de Fourier por Körner


Eche un vistazo a esta pregunta relacionada. Si bien originalmente se le preguntó acerca de la pregunta acerca de VB, las respuestas son genéricas sobre FFT


Un colega mío ha escrito algunas buenas funciones con licencia de GPL para el análisis espectral: http://www.mecheng.adelaide.edu.au/~pvl/octave/

( Actualización : este código ahora es parte de uno de los módulos de Octave:
http://octave.svn.sourceforge.net/viewvc/octave/trunk/octave-forge/main/signal/inst/ .
Pero puede ser complicado extraer de allí las piezas que necesita.)

Están escritos tanto para Matlab como para Octave y sirven principalmente como un reemplazo directo para las funciones análogas en Signal Processing Toolbox. (Así que el código anterior todavía debería funcionar bien.)

Puede ayudar con su análisis de datos; mejor que rodar el tuyo con fft y similares.