Pregunta

Con recursos limitados, tales como más lento de la Cpu, el tamaño del código y la memoria RAM, la mejor manera de detectar el tono de una nota musical, similar a lo que un electrónico o software del sintonizador haría?

Debo usar:

  • Beso FFT
  • FFTW
  • Transformada Wavelet Discreta
  • autocorrelación
  • cruce por cero de análisis
  • octava espacio filtros

otros?

En pocas palabras, lo que estoy tratando de hacer es reconocer una sola nota musical, dos octavas por debajo de la mediana-C para dos octavas arriba, jugado en cualquier (razonable) del instrumento.Me gustaría estar dentro de 20% de la semitono - en otras palabras, si el usuario juega demasiado plana o demasiado fuerte, tengo que distinguir eso.Sin embargo, no voy a necesitar la precisión que se requiere para la optimización.

¿Fue útil?

Solución

Si no es necesario que gran precisión, una FFT podría ser suficiente. la parte de audio de primera para que usted obtenga picos bien definidos, y luego encontrar el primer significativa pico.

anchura Bin = tasa de muestreo / FFT tamaño:

Fundamentos intervalo de 20 Hz a 7 kHz, por lo que una tasa de 14 kHz de muestreo sería suficiente. La siguiente velocidad de muestreo "estándar" es 22.050 Hz.

El tamaño de la FFT se determina entonces por la precisión que desee. salida de la FFT es lineal en frecuencia, mientras que los tonos musicales son logarítmicas en frecuencia, por lo que el peor caso será la precisión en las frecuencias bajas. Para 20% de un semitono a 20 Hz, lo que necesita una anchura de > 1,2 Hz, lo que significa una longitud FFT de 18.545 . La siguiente potencia de dos es 2 15 = 32768. Esto es de 1,5 segundos de datos, y toma procesador de mi portátil 3 ms de calcular.

Esto no funcionará con señales que tienen una " falta fundamental", y la búsqueda la "primera significativa" pico es algo difícil (ya armónicos son a menudo más alto que el fundamental), pero se puede encontrar una manera que se adapte a su situación.

Autocorrelación y espectro de productos armónica son mejores en la búsqueda de la verdad fundamental de una onda en vez de uno de los armónicos, pero no creo que se ocupan, así como con inharmonicity , y la mayoría de los instrumentos como el piano o la guitarra son inarmónicos (armónicos son ligeramente picante de lo que debería ser). Realmente depende de sus circunstancias, sin embargo.

Además, se puede ahorrar aún más ciclos de procesador calculando sólo dentro de una banda de frecuencia específica de interés, utilizando la Chirp-Z transformar .

He escrito algunos métodos diferentes en Python para fines de comparación.

Otros consejos

Si quieres hacer de reconocimiento de tono en tiempo real (y precisos dentro de 1/100 de un semi-tono), su única esperanza real es el cruce por cero enfoque.Y es una débil esperanza, lamento decir.Cruce por cero, se puede estimar el tono de sólo un par de longitudes de onda de los datos, y se puede hacer con un teléfono inteligente de la potencia de procesamiento, pero no es especialmente precisa, ya que pequeños errores en la medición de las longitudes de onda resultado en grandes errores en la estimación de la frecuencia.Dispositivos como sintetizadores de guitarra (que deducir la afinación de la cuerda de una guitarra con sólo un par de longitudes de onda), trabajo de cuantización de las medidas a las notas de la escala.Esto puede funcionar para sus propósitos, pero ser conscientes de que cruce por cero, funciona muy bien con simples formas de onda, pero tiende a trabajar menos y menos con más compleja de sonidos de instrumentos.

En mi aplicación (un sintetizador de software que se ejecuta en los teléfonos inteligentes) yo uso grabaciones de una sola notas del instrumento como materia prima para la síntesis de tabla de ondas, y con el fin de producir notas en un tono particular, necesito saber la frecuencia fundamental de una grabación, exacta dentro de 1/1000 de un semi-tono (realmente sólo necesita 1/100 exactitud, pero estoy TOC acerca de esto).El cruce por cero, el enfoque es mucho demasiado impreciso para ello, y basado en FFT enfoques son demasiado inexactos o de forma demasiado lenta (o dos veces).

El mejor método que he encontrado en este caso es el uso de autocorrelación.Con autocorrelación, básicamente, supongo que el tono y, a continuación, medir la autocorrelación de la muestra en la correspondiente longitud de onda.Mediante el escaneo a través de la gama de posibles lanzamientos (digamos a = 55 Hz a través de Un = 880 Hz) por el semi-tonos, yo busque la mayoría de la correlación de tono, a continuación, hacer una mayor precisión de grano de exploración en el barrio de la cancha para obtener un valor más exacto.

El enfoque mejor para usted depende enteramente de lo que usted está tratando de usar este para.

No estoy familiarizado con todos los métodos que mencionas, pero lo que usted elija debe depender principalmente de la naturaleza de los datos de entrada. ¿Está analizando los tonos puros, o ¿Su fuente de entrada tiene varias notas? Es una característica del habla de su entrada? ¿Hay alguna limitación en la cantidad de tiempo que tiene que probar la entrada? ¿Es capaz de operar fuera cierta precisión para la velocidad?

En cierta medida lo que elija también depende de si se desea, para realizar cálculos en tiempo o en el espacio de frecuencia . La conversión de una series de tiempo a una representación de frecuencia lleva su tiempo, pero en mi experiencia tiende a dar mejores resultados.

Autocorrelación compara dos señales en el dominio del tiempo. Una implementación ingenua es simple pero relativamente caro de calcular, ya que requiere de pares de diferenciación entre todos los puntos en las señales originales y desplazados en el tiempo, seguido de la diferenciación para identificar puntos de inflexión en la función de autocorrelación, y entonces la selección del mínimo correspondiente a la frecuencia fundamental. Existen métodos alternativos. Por ejemplo, magnitud media Diferenciación es una forma muy barata de auto-correlación, pero la precisión se resiente. Todas las técnicas de autocorrelación corren el riesgo de errores de octava, ya que existen picos distintos del fundamental en la función.

puntos de cruce por cero es simple y sencillo, pero tendrá problemas si tiene múltiples formas de onda presentes en la señal.

En el espacio de la frecuencia, las técnicas basadas en FFT pueden ser lo suficientemente eficiente para sus propósitos. Un ejemplo es la técnica de espectro producto armónica, que compara el espectro de potencia de la señal con versiones muestrean en cada armónico, e identifica el terreno de juego multiplicando los espectros juntos para producir un pico claro.

Como siempre, no hay sustituto para la prueba y perfiles de varias técnicas, para determinar empíricamente lo que funciona mejor para su problema y limitaciones.

Una respuesta como ésta sólo puede rayar la superficie de este tema. Así como los enlaces anteriores, aquí hay algunas referencias relevantes para su posterior lectura.

En mi proyecto danstuner , Tomé código de Audacity . En esencia, tomó una FFT, entonces encontró la potencia de pico, poniendo una curva cúbica de la FFT y encontrar el pico de la curva. Funciona bastante bien, a pesar de que tenía que protegerse contra octava de salto.

Spectrum.cpp .

paso por cero no funcionará porque tiene un sonido típico de los armónicos y cruces por cero mucho más que la frecuencia base.

Algo he experimentado con (como un proyecto conjunto local) fue la siguiente:

  1. muestra del sonido con ADC en cualquier frecuencia de muestreo que necesita.
  2. detectar los niveles de los de corto plazo picos positivos y negativos de la forma de onda (ventana deslizante o similar). Es decir. un detector de envolvente.
  3. Hacer una onda cuadrada que pasa a nivel alto cuando la forma de onda va dentro de 90% (o menos) de la envolvente positivo, y pasa a nivel bajo cuando la forma de onda va dentro de 90% de la dotación negativo. Es decir. una onda cuadrada de seguimiento con histéresis.
  4. Medir la frecuencia de esa onda cuadrada con cálculos de conteo / tiempo sencillo, utilizando tantas muestras como sea necesario para obtener la precisión requerida.

Sin embargo he encontrado que con las aportaciones de mi teclado electrónico, para algunos sonidos del instrumento se logró recoger a 2 × la frecuencia base (siguiente octava). Este fue un proyecto paralelo y nunca se decidió a implementar una solución antes de pasar a otras cosas. Pero pensé que tenía la promesa de ser mucho menos carga de la CPU de la FFT.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top