Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # -*- coding: utf-8 -*-
- import numpy as np
- import soundfile as sf
- import os
- # =============================================================================
- # Código para generar y guardar archivos FRD a partir de respuestas al impulso
- # en formato .wav.
- # =============================================================================
- #Tamaño de la FFT
- fft_size= 16384
- #Samples de start y stop
- start_sample = 48000
- stop_sample = 48120
- #Calibración con señal de 94 dBSPL
- cal_enable = True
- cal_SPL = 94
- cal_file = "../Cal/signal.wav" #Ruta del archivo de calibración
- save_dir = "../Mediciones/H/" #Ruta del directorio destino
- file_extension = ".frd" #Extensión del archivo (ej ".frd", ".txt")
- def ir_to_frd(archivo):
- # =============================================================================
- # Recibe una IR en .wav y devuelve un array formato FRD (columnas f, mag, phase)
- # Se debe especificar las muestras de start y stop y el tamaño de la FFT
- # =============================================================================
- #Lee el wav
- wav, fs = sf.read(archivo)
- #Ventanea
- amp = wav[start_sample:stop_sample]
- #Crea un array de frecuencias
- frecuencias = np.linspace(0, fs/2, fft_size//2)
- #Calibración a SPL
- if cal_enable == True:
- amp = calibrate(amp)
- #FFT
- spectrum = np.fft.fft(amp, fft_size)
- mag = np.abs(spectrum[0:fft_size//2])
- phase = np.angle(spectrum[0:fft_size//2], deg=True)
- #dB
- mag = 20*np.log10(mag)
- #Averigua el índice de la primera frecuencia superior a 20 Hz
- for i, f in enumerate(frecuencias):
- if f-20 >= 0:
- idx_20 = i
- break
- #Hace que todo arranque de 20 Hz
- frecuencias = frecuencias[idx_20:]
- mag = mag[idx_20:]
- phase = phase[idx_20:]
- #Stackea frecuencias, mag, phase
- frd = np.vstack((frecuencias, mag, phase))
- #Transpone para que queden en columnas en vez de filas
- frd = np.transpose(frd)
- return frd
- def calibrate(amp):
- # =============================================================================
- # Recibe un array de amplitudes y calibra la amplitud respecto del valor RMS de
- # una señal de calibración (normalmente a 94dBSPL).
- # =============================================================================
- #Lee el archivo de calibración
- cal, fs = sf.read(cal_file)
- #Saca el valor RMS
- cal_rms = np.sqrt(np.mean(cal**2))
- #Saca la relación de presiones y le suma 94 dB
- ampcal = amp/cal_rms * 10**(cal_SPL/20)
- return ampcal
- #Cambia al directorio destino
- os.chdir(save_dir)
- #Crea una lista de archivos (creala como sea más conveniente)
- archivos=[]
- for i in range(37):
- archivos.append("{} grados_hor.wav".format(i*5-90))
- # Para cada archivo saca la FRD y lo guarda en un archivo con la extensión
- # seleccionada. También, iterar como sea más conveniente.
- for i, archivo in enumerate(archivos):
- frd = ir_to_frd(archivo)
- np.savetxt("hor_deg{}".format(i*5-90)+file_extension, frd, fmt='%1.3f')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement