Ультразвукова калібрування динаміків та випромінювання каліброваних сигналів


10

Я намагаюся відкалібрувати ультразвуковий динамік з метою випромінення передбачуваних сигналів, але, на жаль, я все ще натрапляю на проблеми, можливо, через відсутність DSP-фу.

Трохи фону

Я хочу мати можливість відтворювати звуки максимально наближеними до каліброваної запису. Наскільки я розумію теорію, мені потрібно знайти функцію передачі динаміків і відключити сигнали, які я хочу випромінювати. Щось подібне (у частотній області):

X -> H -> XH

Де Xце випромінюється сигнал Hє передавальна функція колонки і XHце Xраз H. Відділення ( ./) тепер має дати мені H.

Тепер, щоб випромінювати калібрований сигнал, його слід розділити на H:

X/H -> H -> X

Що зроблено

  • Розміщений динамік та калібрований мікрофон на відстані 1 м на штативах.
  • Записано 30+ лінійних розгортків 150 КГц-20КГц, довжиною 20 мс, та записано при 500 к.с. / с.
  • Вирівняні та усереднені сигнали зі сценарієм Matlab / Octave нижче, під сценарієм видно отриманий сигнал.
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);

Вирівняні та усереднені сигнали

  • Фур'є перетворив Xі XHзробив вищезазначені розрахунки, результат виглядає правдоподібно. Нижче - нормалізований сюжет H(фіолетовий) та X/H(зелений).

    Діапазон частот H і X / H

Сюжет обрізаний до відповідних частот.

Будь ласка, дайте мені знати, чи буду я про це неправильним шляхом.

Моє запитання

Після підрахунку X/Hмені потрібно перетворити його на часову область, я припустив, що це буде просто ifft(X./H)і wavwrite, але всі мої спроби поки що не змогли отримати жодної правдоподібної відповіді. Вектор частоти Hf, Hі Xможе бути знайдений тут в mat7 довічного формату.

Можливо, я просто втомився, і тут є просте рішення, але на даний момент я його не бачу. Будь-яка допомога / порада високо цінується.


1
Цей потік - dsp.stackexchange.com/questions/953/… - і цей one-dsp.stackexchange.com/questions/2705/… - може бути корисним для вас.
Джим Клей

Так, знайшов мою помилку дякую Джим. Я розглядав лише величину сигналів, що призводить до нульового фазового сигналу часу. Схоже, зараз я отримав правильний результат, і додам це як відповідь.
Тор

Відповіді:


3

Знайшов відповідь, переглянувши посилання, які Джим Клей згадував у коментарях, дякую Джим.

Я допустив помилку лише враховуючи величину, яка призводить до нульового фазу сигналу і не може бути розумно використана для випромінювання, принаймні, не в цій установці.

Код, який я нарешті використав, можна побачити нижче.

Сценарій дотримується правила іменування збереження сигналів часової області в малих та частотних сигналах домену у верхньому регістрі.

% Align and sum all files called Mandag*
files = dir('Mandag*');

% Where in the recordings the signal is
rng = [1.5e6, 1.52e6];

% Initialize the xh vector
[xh, fs] = wavread(files(1).name, rng);
xh = xh(:,1);

for i=2:length(files)
    y = wavread(files(i).name, rng);
    y = y(:,1);
    % Determine offset between xh and y
    [~, off] = max(xcorr(xh', y'));
    off = length(xh) - off;
    % Shift signal appropriately
    if(off < 0)
        y = [zeros(1, -off), y(1:end+off)'];
    elseif (off > 0)
        y = [y(off:end)', zeros(1, off-1)];
    end
    xh = xh + y';
end

% Average
xh = xh/length(files);

% Location of the 20ms signal
xh = xh(2306:12306-1);

% Normalize
xh = xh / max(xh);

% Apply a moving average filter on xh to reduce noise. Window size of 4 was
% experimentally determined to give the best results
n = 4;
B = zeros(n, 1);
for i=1:n
  B(i) = 1/n;
end
xh = filter(B, 1, xh);
xh = xh / max(xh);

x = wavread('sweep.wav');
x = x(1:2:end);            % Sweep generated @ 1MHz, decimate
                           % to have same length as xh

% Transform x into frequency domain and determine H
X = fft(x);
H = fft(xh) ./ X;

% Vector indices to choose only frequencies of interest
starti =  20e3 / 50;
endi   = 100e3 / 50;
rng    = starti:endi;
irng   = (length(x) - endi) : (length(x) - starti);

% Zero out unwanted frequencies
X = [zeros(1,      starti - 1   ), X( rng)', zeros(1, length(X)/2 - endi) ...
     zeros(1, length(X)/2 - endi), X(irng)', zeros(1,      starti - 1   )]';

% Deconvolve x with h
X_deconv_H = X ./ H;

% Transform X/H to time domain and normalise
x_deconv_h = real(ifft(X_deconv_H));
x_deconv_h = x_deconv_h / max(x_deconv_h);

% Save the deconvolved sweep
wavwrite(x_deconv_h, fs, 'deconvolved_sweep.wav');

% Generate  spectrograms of xh and x_deconv_h
winsize = 512;
overlap = round(.99 * winsize);
figure(1)
specgram(xh, winsize, fs, hann(winsize), overlap)
colorbar
figure(2)
specgram(x_deconv_h, winsize, fs, hann(winsize), overlap)
colorbar

Спектрограми x conv hта x deconv hїх можна побачити нижче:

спектрограма x conv h спектрограма x deconv h

Вони здаються мені правдоподібними, хоча в дезактиваційному сигналі є якийсь шум.

Наступним тестом буде перевірити, чи x_deconv_yдає випромінювання щось подібне до xзаборони тих частот, які динамік не може випромінювати.

Оновити з результатами тесту

Ми повторно описували описані вище вимірювання, використовуючи логарифмічний знімок. Ці результати, схоже, говорять про те, що метод працює.

Тест на перевірку складався з випромінювання X / Hта очікування Xповернення, тобто однакової енергії на всіх частотах. Оскільки найгірша вихідна частота приблизно на 20 дБ слабша за найкращу, очікується, що найвищий рівень виходу буде набагато нижчим.

Сигнал, який випромінював:

Часовий ряд випромінюваного сигналу

Часовий ряд і спектрограма записаного сигналу виглядають так:

Часовий ряд випромінюваного сигналу Часовий ряд випромінюваного сигналу


Будь-яке оновлення щодо цього? Як ви виглядали випромінюваний сигнал?
Ленс

@Busk: Дякую за інтерес. Я ще не мав можливості перевірити це, оскільки обладнання використовується в іншому місці. Опублікую результати, коли я пройду тест.
Тор

@Busk: ми зараз це протестували і, здається, працює :-).
Тор
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.