Estoy tratando de calibrar un altavoz ultrasónico con el objetivo de emitir señales predecibles, pero lamentablemente sigo teniendo problemas, probablemente debido a mi falta de DSP-fu.
Un poco de historia
Quiero poder reproducir sonidos lo más cerca posible de una grabación calibrada que tengo. Hasta donde entiendo la teoría, necesito encontrar la función de transferencia de altavoces y desconvolver las señales que quiero emitir con ella. Algo como esto (en el dominio de la frecuencia):
X -> H -> XH
Donde X
está la señal emitida H
es la función de transferencia de los altavoces y XH
son los X
tiempos H
. Una división ( ./
) ahora debería darme H
.
Ahora, para emitir una señal calibrada, debe dividirse entre H
:
X/H -> H -> X
Que se ha hecho
- Altavoz colocado y un micrófono calibrado a 1 m de distancia sobre trípodes.
- Grabado 30+ barridos lineales 150KHz-20KHz, 20ms de largo, y grabado a 500 KS / s.
- Señales alineadas y promediadas con el script Matlab / Octave a continuación, debajo del script se puede ver la señal resultante.
files = dir('Mandag*');
rng = [1.5e6, 1.52e6];
[X, fs] = wavread(files(1).name, rng);
X = X(:,1);
for i=2:length(files)
[Y, fs] = wavread(files(i).name, rng);
sig = Y(:,1);
[x, off] = max(xcorr(X', sig'));
off = length(X) - off;
if(off < 0)
sig = [zeros(1, -off), sig(1:end+off)'];
elseif (off > 0)
sig = [sig(off:end)', zeros(1, off-1)];
end
X = X + sig';
end
X = X/length(files);
Fourier se transformó
X
eXH
hizo los cálculos mencionados anteriormente, el resultado parece plausible. A continuación se muestra una gráfica normalizada deH
(púrpura) yX/H
(verde).
La trama se ha truncado a las frecuencias relevantes.
Por favor, avíseme si voy por el camino equivocado.
Mi pregunta
Después de calcular X/H
que necesito transformarlo nuevamente en el dominio del tiempo, asumí que esto sería simple ifft(X./H)
y wavwrite
, pero todos mis intentos hasta ahora no han logrado obtener una respuesta plausible. Un vector de frecuencias Hf
, H
y X
se puede encontrar aquí en formato binario mat7.
Quizás estoy cansado y hay una solución simple aquí, pero por el momento no puedo verla. Cualquier ayuda / consejo es muy apreciada.
Respuestas:
Encontré la respuesta después de mirar las referencias que Jim Clay mencionó en los comentarios, gracias Jim.
Cometí el error de solo considerar la magnitud que da como resultado una señal de fase cero y no se puede usar de manera sensata para la emisión, al menos no en esta configuración.
El código que finalmente terminé usando se puede ver a continuación.
El script se adhiere a la convención de nomenclatura de mantener las señales del dominio del tiempo en minúsculas y las señales del dominio de frecuencia en mayúsculas.
Los espectrogramas de
x conv h
yx deconv h
se pueden ver a continuación:Esto me parece plausible, aunque hay algo de ruido en la señal deconvolucionada.
La siguiente prueba será ver si emitir
x_deconv_y
produce algo parecidox
a las frecuencias que el altavoz no puede emitir.Actualización con resultados de prueba
Rediseñamos las medidas descritas anteriormente usando un barrido descendente logarítmico. Estos resultados parecen sugerir que el método funciona.
La prueba de verificación consistió en emitir
X / H
y esperarX
volver, es decir, igual energía en todas las frecuencias. Como la peor frecuencia de salida es aproximadamente 20 dB más débil que la mejor, se espera que el nivel de salida más alto sea mucho más bajo.La señal que se emitió:
La serie temporal y el espectrograma de la señal grabada se ven así:
fuente