User Tools

Site Tools


graficar_respuesta_del_barrido_en_frecuencia_con_python

This is an old revision of the document!


Análisis de Respuesta en Frecuencia y Distorsión Armónica con Python

Objetivo: Este artículo detalla cómo medir y analizar la respuesta en frecuencia y la distorsión armónica de un dispositivo de sonido utilizando Python. Usaremos un barrido de frecuencias, capturaremos la señal de audio y realizaremos el análisis de la Transformada Rápida de Fourier (FFT).

Script para Barrido de Frecuencias y Análisis FFT

main.py
import numpy as np
import pyaudio
import matplotlib.pyplot as plt
from scipy.fft import fft, fftfreq
 
def generate_sweep(start_freq, end_freq, duration, sample_rate=44100):
    t = np.linspace(0, duration, int(sample_rate * duration), False)
    sweep = np.sin(2 * np.pi * np.logspace(np.log10(start_freq), np.log10(end_freq), t.size))
    return t, sweep
 
def play_and_record(sweep, duration, sample_rate=44100, channels=1):
    p = pyaudio.PyAudio()
 
    stream = p.open(format=pyaudio.paFloat32,
                    channels=channels,
                    rate=sample_rate,
                    output=True,
                    input=True,
                    frames_per_buffer=1024)
 
    recorded_frames = []
 
    stream.start_stream()
    stream.write(sweep.astype(np.float32).tobytes())
 
    for _ in range(0, int(sample_rate / 1024 * duration)):
        data = stream.read(1024)
        recorded_frames.append(np.frombuffer(data, dtype=np.float32))
 
    stream.stop_stream()
    stream.close()
    p.terminate()
 
    recorded_signal = np.hstack(recorded_frames)
    return recorded_signal
 
def calculate_fft(signal, sample_rate=44100):
    N = len(signal)
    yf = fft(signal)
    xf = fftfreq(N, 1 / sample_rate)[:N // 2]
    return xf, 2.0 / N * np.abs(yf[:N // 2])
 
def plot_response(xf, yf, test_frequency):
    plt.figure(figsize=(10, 6))
 
    # Convert frequencies to be relative to the test_frequency
    relative_xf = xf / test_frequency
 
    plt.plot(relative_xf, 20 * np.log10(yf))
    plt.title('Frequency Response (Logarithmic Scale)')
    plt.xlabel('Frequency Relative to Test Frequency (log scale)')
    plt.ylabel('Intensity (dB)')
    plt.grid()
    plt.xscale('log')
    plt.xlim(1, relative_xf.max())  # Start at 1 (test frequency) and go to max relative frequency
    plt.ylim(20 * np.log10(yf).min(), 20 * np.log10(yf).max())
    plt.axvline(x=1, color='r', linestyle='--')  # Mark the test frequency
    plt.show()
 
if __name__ == "__main__":
    start_freq = 20
    end_freq = 20000
    duration = 10  # Duration in seconds
    sample_rate = 44100
 
    t, sweep = generate_sweep(start_freq, end_freq, duration, sample_rate)
    recorded_signal = play_and_record(sweep, duration, sample_rate)
    xf, yf = calculate_fft(recorded_signal, sample_rate)
    plot_response(xf, yf, 1000)  # Assuming 1 kHz as test frequency

Explicación del Código

1. Generación del barrido de frecuencias:

  • `generate_sweep` crea un barrido logarítmico de frecuencias de `start_freq` a `end_freq` durante `duration` segundos.

2. Reproducción y grabación:

  • `play_and_record` reproduce el barrido de frecuencias y simultáneamente graba la señal de audio del micrófono.
  • La señal grabada se almacena en `recorded_frames` y se convierte en un array de `numpy`.

3. Cálculo de la FFT:

  • `calculate_fft` calcula la FFT de la señal grabada, devolviendo las frecuencias (`xf`) y la magnitud de la FFT (`yf`).

4. Ploteo de la respuesta en frecuencia:

  • `plot_response` grafica la magnitud de la FFT en función de la frecuencia, utilizando una escala logarítmica para el eje de las frecuencias.

Notas Adicionales

  • Compatibilidad de hardware: Este script asume que el micrófono y los altavoces están bien calibrados y pueden manejar el rango de frecuencias de 20 Hz a 20 kHz. En la práctica, algunos dispositivos de audio pueden no tener una respuesta plana en todo este rango.
  • Latencia y sincronización: La latencia de audio y posibles desincronizaciones pueden afectar la precisión del análisis. Este script es una aproximación simple y puede necesitar ajustes para aplicaciones más precisas.
  • Seguridad Auditiva: Asegúrate de mantener el volumen a un nivel seguro para evitar daños auditivos, especialmente cuando trabajes con frecuencias altas y barridos de amplio rango.

Prueba este script y ajusta los parámetros según tus necesidades. ¡Buena suerte con tu análisis de la respuesta en frecuencia de tu dispositivo de sonido!

graficar_respuesta_del_barrido_en_frecuencia_con_python.1717284595.txt.gz · Last modified: 2024/10/17 21:42 (external edit)