Pregunta

Tengo este código, pero sigue volviendo al azar frecuencias de 0 a alrededor de 1050. Por favor, puede ayudar a entender por qué esto está ocurriendo.

Mi longitud de datos es 1024, frecuencia de muestreo es 8.192, y los datos es un corto matriz llena de datos de entrada del micrófono.


float *iSignal = new float[2048];
float *oSignal = new float[2048];
int pitch = 0;

for(x=0;x<=1024;x++) {
    iSignal[x] = data[x];
}

fft(iSignal,oSignal,1024); //Input data, output data, length of input and output data

for(int y=0;y< 2048;y+=2) {
if((pow(oSignal[y],2)+pow(oSignal[y+1],2))>(pow(oSignal[pitch],2)+pow(oSignal[(pitch)+1],2))) {
        pitch = y;
    }
}

double pitchF = pitch / (8192.0/1024);
printf("Pitch: %f\n",pitchF);

Gracias,

Niall.

Editar:. Se ha cambiado el código, pero sigue volviendo frecuencias al azar

¿Fue útil?

Solución

oSignal Suponiendo que está lleno de números complejos, de tal manera, que las partes real e imaginaria alternativa, podría ayudar a cambiar

for(int y=0;y< 8191;y++)

a

for(int y=0;y< 8191;y+=2)

Editar: Ni siquiera me había dado cuenta de que estás pasando sólo 1.024 muestras. Debe pasar la mayor cantidad de muestras de dominio de tiempo, ya que habrá muestras de dominio de la frecuencia, en su caso 4096.

Edit: Una cosa más: obviamente estás tratando de encontrar la frecuencia base de algo. A menos que algo es una computadora genera tono o un silbato humana (ambos de los cuales son tonos muy puros), puede ser decepcionado por el resultado. El método simple informados apenas funciona para flauta.

Editar: para voz y guitarra que está de suerte. Escribí un programa hace algún tiempo que muestra el dominio de la frecuencia, hay que probarlo, verá el problema. También hay fuentes, disponible, si está interesado.

editar final : Es posible que desee leer el artículo de la Wikipedia de detección de tono . Concentrarse en los enfoques de dominio de tiempo.

Otros consejos

Parece iSignal [1025] .. iSignal [8191] contiene datos aleatorios. Se podría tratar de ponerlo a 0. Pero ¿por qué se pasa a 8.192 fft () si su longitud de datos es 1024 (o se trata de 1025)?

Además, perder algo de precisión en la división entera. Cambiarlo a doble PITCHf = paso / (8192,0 / 1024);

¿Su función FFT espera datos de entrada reales o complejos? En caso de que espera que los datos complejos, usted tiene que fijar cada otro ingreso de iSignal a 0.

"frecuencias aleatorias de 0 a alrededor de 1050" - no la señal de audio típicas consisten en una combinación de frecuencias? Dado que la frecuencia de muestreo es de 8192 Hz, el FFT puede detectar hasta 8192/2 = 4096 Hz. Yo esperaría que usted vería una combinación de muchas frecuencias, pero yo no los llamaría "al azar".

¿Por qué te sorprende? ¿Qué me he perdido?

Dos cosas:

  • ¿Está seguro que está utilizando la función de su fft correctamente? Tratas a la salida como si se trata de un complejo conjunto organizado [R_1 I_1 R_2 I_2 ...], pero tratas a la matriz de entrada como si se organiza [R_1 R_2 R_3 ... R_1024 I_1 I_2 ...] y como dice Henrik luego dejan las piezas complejas sin inicializar.
  • es extremadamente primitiva, aunque debe hacer por simple entrada ( como una sola picadura de guitarra). Para su uso con una voz humana, es casi seguro que desea un enfoque más sofisticado.

¿Usted ha intentado poner un simple señal conocida (es decir sinusoidal pura) como entrada?

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