señales reproducir procesamiento leer graficar como archivos archivo abrir audio music signal-processing fft pitch-tracking

audio - procesamiento - reproducir un archivo wav en python



¿Cómo se analiza la frecuencia fundamental de una muestra PCM o WAV? (7)

Tengo una muestra en un buffer de DirectX. Es una muestra de una nota reproducida y capturada de un instrumento. ¿Cómo analizo la frecuencia de la muestra (como lo hace un sintonizador de guitarra)? Creo que las FFT están involucradas, pero no tengo indicaciones para HOWTOs.


Aplique una DFT y luego obtenga la frecuencia fundamental de los resultados. Buscar la información de DFT en Google le dará la información que necesita, lo vincularé con algunos, pero difieren mucho en las expectativas de conocimiento de las matemáticas.

Buena suerte.


La FFT puede ayudarlo a determinar dónde está la frecuencia, pero no puede decirle exactamente cuál es la frecuencia. Cada punto en la FFT es un "depósito" de frecuencias, por lo que si hay un pico en su FFT, todo lo que sabe es que la frecuencia que desea está en algún lugar dentro de ese bin, o rango de frecuencias.

Si lo quiere realmente preciso, necesita una FFT larga con una resolución alta y muchos contenedores (= mucha memoria y muchos cálculos). También puede adivinar el verdadero pico de una FFT de baja resolución utilizando la interpolación cuadrática en el espectro de escala logarítmica, que funciona sorprendentemente bien.

Si el costo computacional es más importante, puede tratar de obtener la señal en una forma en la que pueda contar los cruces cero, y cuanto más cuente, más precisa será su medición.

Sin embargo, ninguno de estos funcionará si falta el fundamental . :)

here he esbozado algunos algoritmos diferentes, y la FFT interpolada es generalmente la más precisa (aunque esto solo funciona cuando el fundamental es el armónico más fuerte ; de lo contrario, debes ser más inteligente para encontrarlo), con cero cruces en un segundo cercano (aunque esto solo funciona para formas de onda con un cruce por ciclo ). Ninguna de estas condiciones es típica.

Tenga en cuenta que los parciales superiores a la frecuencia fundamental no son armónicos perfectos en muchos instrumentos, como el piano o la guitarra. Cada parcial es en realidad un poco desafinado o inharmonic . Por lo tanto, los picos de mayor frecuencia en la FFT no estarán exactamente en los múltiplos enteros de la fundamental, y la forma de la onda cambiará ligeramente de un ciclo al siguiente, lo que arroja autocorrelación.

Para obtener una lectura de frecuencias realmente precisa, yo diría que use la autocorrelación para adivinar la fundamental, luego encuentre el pico verdadero usando la interpolación cuadrática. (Puede hacer la autocorrelación en el dominio de frecuencia para ahorrar ciclos de CPU.) Hay muchos errores, y el método correcto para usar realmente depende de su aplicación.


La recuperación de frecuencias fundamentales en una señal de audio PCM es una tarea difícil, y habría mucho de qué hablar ...

De todos modos, generalmente el método basado en el tiempo no es adecuado para señales polifónicas, porque una onda compleja dada por la suma de diferentes componentes armónicos debido a múltiples frecuencias fundamentales tiene una tasa de cruce cero que depende solo del componente de frecuencia más baja ... También en el dominio de frecuencia de FFT no es el método más adecuado, ya que el espaciado de frecuencia entre notas sigue una escala exponencial, no lineal. Esto significa que una resolución de frecuencia constante, utilizada en el método FFT, puede ser insuficiente para resolver notas de frecuencia más baja si el tamaño de la ventana de análisis en el dominio de tiempo no es lo suficientemente grande.

Un método más adecuado sería una transformación Q constante, que se aplica mediante DFT después de un proceso de filtrado de paso bajo y destrucción por 2 (es decir, dividiendo a la mitad cada paso de la frecuencia de muestreo) de la señal, para obtener diferentes subbandas con diferente frecuencia resolución. De esta forma, el cálculo de DFT está optimizado. El problema es que también la resolución de tiempo es variable y aumenta para las subbandas inferiores ...

Finalmente, si estamos tratando de estimar la frecuencia fundamental de una sola nota, los métodos FFT / DFT están bien. Las cosas cambian para un contexto polifónico, en el que los parciales de diferentes sonidos se superponen y anulan / cancelan su amplitud dependiendo de su diferencia de fase, por lo que un solo pico espectral podría pertenecer a diferentes contenidos armónicos (pertenecientes a diferentes notas). La correlación en este caso no da buenos resultados ...


Las FFT (transformadas rápidas de Fourier) estarían involucradas. Las FFT le permiten aproximar cualquier señal analógica con una suma de ondas sinusoidales simples de frecuencias fijas y amplitudes variables. Lo que esencialmente hará será tomar una muestra y descomponerla en pares de amplitud-> frecuencia, y luego tomar la frecuencia que corresponda a la amplitud más alta.

¡Ojalá otro lector SO pueda llenar los vacíos que estoy dejando entre la teoría y el código!


Los afinadores de guitarra no usan FFT ni DFT. Por lo general, solo cuentan los cruces cero. Puede que no obtenga la frecuencia fundamental porque algunas formas de onda tienen más cruces por cero que otras, pero normalmente puede obtener un múltiplo de la frecuencia fundamental de esa manera. Eso es suficiente para obtener la nota, aunque puede que esté a una o más octavas apagadas.

El filtrado de paso bajo antes de contar los cruces por cero generalmente puede eliminar el exceso de cruces por cero. El ajuste del filtro de paso bajo requiere un conocimiento del rango de frecuencia que desea detectar, aunque


También hay otros algoritmos que se basan en el tiempo, no en la frecuencia. La autocorrelación es un algoritmo relativamente simple para la detección de tono. Referencia: http://cnx.org/content/m11714/latest/

He escrito implementaciones de c # de autocorrelación y otros algoritmos que son legibles. Consulte http://code.google.com/p/yaalp/ .

http://code.google.com/p/yaalp/source/browse/#svn/trunk/csaudio/WaveAudio/WaveAudio Enumera los archivos, y PitchDetection.cs es el que desea.

(El proyecto es GPL, así que entiende los términos si usas el código).


Un poco más específicamente:

Si comienzas con el PCM en bruto en una matriz de entrada, lo que tienes básicamente es un gráfico de amplitud de onda en función del tiempo. Hacer una FFT lo transformará en un histograma de frecuencias para frecuencias de 0 a 1/2 de la frecuencia de muestreo de entrada. El valor de cada entrada en la matriz de resultados será la "fuerza" de la subfrecuencia correspondiente.

Entonces, para encontrar la frecuencia raíz dada una matriz de entrada de tamaño N muestreada en S muestras / segundo:

FFT(N, input, output); max = max_i = 0; for(i=0;i<N;i++) if (output[i]>max) max_i = i; root = S/2.0 * max_i/N ;