J'essaie de calibrer un haut-parleur à ultrasons dans le but d'émettre des signaux prévisibles, mais hélas, je continue de rencontrer des problèmes, probablement en raison de mon manque de DSP-fu.
Un peu de fond
Je veux pouvoir lire des sons aussi près que possible d'un enregistrement calibré que j'ai. Pour autant que je comprends la théorie, je dois trouver la fonction de transfert des haut-parleurs et déconvolver les signaux que je veux émettre avec. Quelque chose comme ça (dans le domaine fréquentiel):
X -> H -> XH
Où X
est le signal émis H
est la fonction de transfert des haut-parleurs et XH
est le X
temps H
. Une division ( ./
) devrait maintenant me donner H
.
Maintenant, afin d'émettre un signal calibré, il doit être divisé par H
:
X/H -> H -> X
Ce qui a été fait
- Haut-parleur placé et un microphone calibré à 1 m de distance sur les trépieds.
- Enregistré plus de 30 balayages linéaires 150KHz-20KHz, 20ms de long, et enregistré à 500 KS / s.
- Signaux alignés et moyennés avec le script Matlab / Octave ci-dessous, sous le script, le signal résultant peut être vu.
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 s'est transformé
X
etXH
et a fait les calculs mentionnés ci-dessus, le résultat semble plausible. Vous trouverez ci-dessous un tracé normalisé deH
(violet) etX/H
(vert).
Le tracé a été tronqué aux fréquences pertinentes.
S'il vous plaît, faites-moi savoir si je m'y trompe.
Ma question
Après avoir calculé que X/H
je devais le reconvertir dans le domaine temporel, j'ai supposé que ce serait simple ifft(X./H)
et wavwrite
, mais toutes mes tentatives jusqu'à présent n'ont pas réussi à obtenir une réponse plausible. Un vecteur de fréquence Hf
, H
et X
peut être trouvé ici en format mat7 binaire.
Peut-être que je suis juste fatigué et qu'il y a une solution simple ici, mais pour le moment je ne la vois pas. Toute aide / conseil est très apprécié.
Réponses:
J'ai trouvé la réponse après avoir regardé les références que Jim Clay a mentionnées dans les commentaires, merci Jim.
J'ai fait l'erreur de ne considérer que l'amplitude qui se traduit par un signal déphasé et ne peut pas être utilisé de manière raisonnable pour l'émission, du moins pas dans cette configuration.
Le code que j'ai finalement utilisé peut être vu ci-dessous.
Le script respecte la convention de dénomination consistant à conserver les signaux du domaine temporel en minuscules et les signaux du domaine fréquentiel en majuscules.
Les spectrogrammes de
x conv h
etx deconv h
peuvent être vus ci-dessous:Ceux-ci me semblent plausibles bien qu'il y ait du bruit dans le signal déconvolué.
Le prochain test consistera à voir si l'émission
x_deconv_y
donne quelque chose de semblablex
sauf les fréquences que le haut-parleur ne peut pas émettre.Mise à jour avec les résultats des tests
Nous avons refait les mesures décrites ci-dessus en utilisant un balayage descendant logarithmique. Ces résultats semblent suggérer que la méthode fonctionne.
Le test de vérification consistait à émettre
X / H
et à espérer récupérerX
, c'est-à-dire une énergie égale à toutes les fréquences. Comme la pire fréquence de sortie est environ 20 dB plus faible que la meilleure, le niveau de sortie le plus élevé devrait être beaucoup plus faible.Le signal émis:
La série chronologique et le spectrogramme du signal enregistré ressemblent à ceci:
la source