fftsharp

Cómo calcular FFT en C# con FFTSharp

FFTSharp es una biblioteca para .NET de procesamiento de señales que proporciona funciones para realizar transformadas de Fourier rápidas (FFT) y otros algoritmos de procesamiento de señales.

La Transformada de Fourier es una herramienta matemática que permite convertir una señal en el dominio del tiempo a su representación en el dominio de la frecuencia. Incluso aunque no os suena la operación seguro que la habéis usado, por ejemplo, al usar un ecualizador para ajustar “los graves y los agudos” de un reproductor de audio.

En el caso de señales muestreadas (discretizadas) el equivalente es la DFT (transformada de Fourier discreta). Por su parte, la FFT (Fast Fourier Transform) es un algoritmo para calcular la DFT y su inversa de forma eficiente, computacionalmente.

La FFT es una técnica muy utilizada en el procesamiento de señales, con aplicaciones en gran cantidad de casos. Se emplea desde el procesamiento de señales de audio, imágenes o video, hasta el análisis de datos sísmicos y astronómicos.

FFTSharp nos permite implementar estas funcionalidades de forma sencilla en una aplicación .NET, incluyendo.

  • Transformadas de Fourier rápidas (FFT) de alta precisión y velocidad
  • Funciones para calcular espectros de potencia, espectros de fase y otros cálculos relacionados
  • Funciones para aplicar ventanas de análisis y filtrado a las señales
  • Funciones para realizar operaciones de convolución y correlación

Está diseñado para ser fácil de usar, y ofrecer un rendimiento rápido y preciso. Por lo que es una excelente opción para cuando tengamos que realizar tratamiento de señales. Típicamente audio e imágenes, aunque es de utilidad en cualquier serie de datos.

Cómo usar FFTSharp

Podemos añadir la biblioteca a un proyecto de .NET fácilmente, a través del paquete Nuget correspondiente.

Install-Package FftSharp

Ahora podemos usar FFTSharp en una serie de datos, de la siguiente forma.

double[] data = { 1, 2, 3, 4, 5, 4, 3, 2, 1 };

var spectrum = FftSharp.Transform.FFTpower(data);
for (int i = 0; i < spectrum.Length; i++)
{
	Console.WriteLine($"Frequency: {i}, Power: {spectrum[i]}");
}

Aquí tenemos un ejemplo de cómo usarlo en una onda muestreada de audio, junto a la librería ScottPlot para graficar los datos.

// sample audio with tones at 2, 10, and 20 kHz plus white noise
double[] signal = FftSharp.SampleData.SampleAudio1();
int sampleRate = 48_000;

// plot the sample audio
var plt = new ScottPlot.Plot(400, 200);
plt.AddSignal(signal, sampleRate / 1000.0);
plt.YLabel("Amplitude");
plt.Margins(0);
plt.SaveFig("time-series.png");

En la página del proyecto se explican las distintas opciones y más ejemplos. También proporcionan en el repositorio una aplicación Demo para comprobar el funcionamiento de las opciones en sonido simulado, y otra empleando audio real obtenido con un micrófono.

FFTSharp es Open Source bajo licencia MIT, y todo el código y documentación está disponible en el repositorio del proyecto en https://github.com/swharden/FftSharp.