Visual C++ .NET - FFT

 
Vista:

FFT

Publicado por patricia (3 intervenciones) el 24/03/2011 11:06:06
Hola, tengo una señal que es un sonido con extensión .wav y me gustaría poder obtener su FFT.
¿alguien podría ayudarme?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Obtener FFT de una señal de sonido .wav

Publicado por Alejandro (265 intervenciones) el 09/02/2024 17:43:21
Patricia, para calcular la transformada rápida de Fourier (FFT) de una señal de sonido en formato .wav en un proyecto de Visual C++, puedes seguir estos pasos:

1. Incluir la biblioteca FFTW:
- Descarga e incluye la biblioteca FFTW (Fastest Fourier Transform in the West) en tu proyecto. Puedes obtenerla en: FFTW (http://www.fftw.org/).

2. Configurar inclusión y bibliotecas:
- En Visual Studio, configura las rutas de inclusión (`Include Directories`) para que apunten a la carpeta `include` de FFTW.
- Configura las rutas de las bibliotecas (`Library Directories`) para que apunten a la carpeta `lib` de FFTW.
- En "Propiedades del proyecto -> Configuración de vinculador -> Entrada -> Dependencias adicionales", agrega el nombre de la biblioteca FFTW (por ejemplo, `libfftw3.lib`).

3. Incluir encabezados necesarios:
1
2
3
#include <fftw3.h>
#include <iostream>
#include <fstream>

4. Leer el archivo .wav:
- Utiliza una biblioteca para leer el archivo .wav. Por ejemplo, podrías usar la biblioteca WAVFile (https://github.com/adamstark/WAVFile) para simplificar la lectura.

1
2
3
4
5
6
7
8
9
#include "WAVFile.h"
 
// ...
 
WAVFile wavFile;
if (!wavFile.read("tu_archivo.wav")) {
    std::cerr << "Error al leer el archivo WAV.\n";
    return -1;
}

5. Preparar datos para la FFT:
- Extrae los datos de la señal de sonido y prepáralos para la FFT.

1
2
3
4
5
6
7
fftw_complex* in = (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * wavFile.getNumSamples());
fftw_complex* out = (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * wavFile.getNumSamples());
 
for (int i = 0; i < wavFile.getNumSamples(); ++i) {
    in[i][0] = static_cast<double>(wavFile.getSample(i));
    in[i][1] = 0.0;
}

6. Calcular la FFT:
- Utiliza FFTW para calcular la FFT de los datos preparados.

1
2
3
fftw_plan plan = fftw_plan_dft_1d(wavFile.getNumSamples(), in, out, FFTW_FORWARD, FFTW_ESTIMATE);
fftw_execute(plan);
fftw_destroy_plan(plan);

7. Imprimir resultados:
- Imprime o maneja los resultados según sea necesario.

1
2
3
for (int i = 0; i < wavFile.getNumSamples(); ++i) {
    std::cout << "FFT[" << i << "] = " << out[i][0] << " + " << out[i][1] << "i\n";
}


8. Limpiar memoria:
- No olvides liberar la memoria después de usar FFTW.

1
2
fftw_free(in);
fftw_free(out);

Este es un ejemplo básico y puede requerir ajustes según tus necesidades específicas. Asegúrate de leer la documentación de FFTW y adaptar el código según tus requisitos particulares.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar