Algoritmo para determinar la frecuencia fundamental a partir de armónicos potenciales

Estoy intentando extraer una frecuencia fundamental de una fuente de sonido. tal vez alguien está cantando A3 en el micrófono, así que quiero detectar ~ 110Hz

mi enfoque es:

Flotadores FFT 1024use la fase de cada contenedor para determinar con precisión su frecuencia precisadeterminar picos (típicamente 50 o menos)ordenarlos con el más fuerte primero

(Pico [0] .power = 1063.343750, .freq = 2032.715088
(Pico [1] .power = 1047.764893, .freq = 3070.605225
(Pico [2] .power = 1014.986877, .freq = 5925.878418
(Pico [3] .power = 1011.707825, .freq = 6963.769043
(Pico [4] .power = 1009.152954, .freq = 4022.363037
(Pico [5] .power = 995.199585, .freq = 4974.120605
(Pico [6] .power = 987.243713, .freq = 8087.792480
(Pico [7] .power = 533.514832, .freq = 908.691833

(MARCADOR1) comienza con el más alto y lo compara con todos los picos restantes, por lo que si tuviera N picos, tendré en este punto N-1 pares de picosexaminar cada par de picos para la armonía; es decir, qué tan cerca está de alguna fracción a / b, es decir, ¿podemos encontrar a / b con b <20 tal que | peakA.freq / peakB.freq - a / b | <0.01 (esto coincidiría con los armónicos hasta el vigésimo)

ahora tenemos una lista refinada de picos que se consideran armónicos entre sí

Harmonic PeakPair: (0,1) = 2/3, error: 0.00468 => f0 @ 1019.946289
Harmonic PeakPair: (0,2) = 1/3, error: 0.00969 => f0 @ 2004.003906
Pico armónico: (0,3) = 2/7, error: 0.00618 => f0 @ 1005.590820
Harmonic PeakPair: (0,4) = 1/2, error: 0.00535 => f0 @ 2021.948242
Pico armónico: (0,5) = 2/5, error: 0.00866 => f0 @ 1005.590820
Harmonic PeakPair: (0,6) = 1/4, error: 0.00133 => f0 @ 2027.331543
Harmonic PeakPair: (0,7) = 9/4, error: 0.01303 => f0 @ 226.515106

Mi pregunta es: ¿cómo puedo diseñar un algoritmo que identifique correctamente el fundamental anterior como ~ 1000Hz?

De ninguna manera se garantiza que habrá una mayor concentración de valores en ~ 1000 que en ~ 2000 o ~ 3000, etc. Ni siquiera se garantiza que haya alguna entrada ~ 1000. podríamos tener ~ 5000 x una entrada, ~ 4000 x tres entradas, ~ 3000 x 2 entradas y un par de valores falsos flotando, como el 226 en la lista anterior.

Supongo que puedo repetir el procedimiento nuevamente, eliminando los fundamentos sugeridos que no son 'armónicos' con el resto de la lista. esto al menos eliminaría los valores falsos ...

Puede ser que ni siquiera estoy haciendo la pregunta correcta. Quizás todo este enfoque apesta. Pero creo que tiene sentido elegir el pico más fuerte y extraer un conjunto de armónicos asociados con ese pico.

en teoría, eso debería generar una carga de relaciones, por ejemplo, si el pico más fuerte original fue el tercer armónico, entonces este conjunto de picos debería contener 3/1 3/2 3/3 3/4 3/5 3/6 3/7, etc. ... aunque algunos pueden faltar.

Realmente tengo la sensación de que siempre será un armónico fundamental o el primer armónico que tenga la mayor fuerza. pero no sé si puedo confiar en esto ...

tantos factores, está haciendo que mi cabeza nade. Pido disculpas de antemano por una pregunta tan desordenada. Espero poder ordenarlo póstumamente.

Respuestas a la pregunta(3)

Su respuesta a la pregunta