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 Xestá la señal emitida Hes la función de transferencia de los altavoces y XHson los Xtiempos 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ó
XeXHhizo 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/Hque 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, Hy Xse 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.


