Я пытаюсь откалибровать ультразвуковой громкоговоритель, чтобы излучать предсказуемые сигналы, но, увы, я продолжаю сталкиваться с проблемами, вероятно, из-за отсутствия 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
(зеленый).
Сюжет был усечен до соответствующих частот.
Пожалуйста, дайте мне знать, если я поступаю неправильно.
Мой вопрос
После вычисления X/H
мне нужно преобразовать его обратно во временную область, я предположил, что это будет просто ifft(X./H)
и wavwrite
, но все мои попытки до сих пор не дали никакого правдоподобного ответа. Вектор частоты Hf
, H
и X
может быть найден здесь в mat7 двоичного формата.
Может быть, я просто устал, и здесь есть простое решение, но сейчас я его не вижу. Любая помощь / совет очень ценится.
Ответы:
Нашел ответ после просмотра ссылок, которые Джим Клэй упомянул в комментариях, спасибо, Джим.
Я допустил ошибку, рассматривая только величину, которая приводит к нулевой фазе сигнала и не может быть разумно использована для излучения, по крайней мере, в этой настройке.
Код, который я наконец-то использовал, можно увидеть ниже.
Скрипт придерживается соглашения о присвоении имен, состоящего в том, чтобы хранить сигналы временной области в нижнем регистре и сигналы частотной области в верхнем регистре.
Спектрограммы
x conv h
иx deconv h
можно увидеть ниже:Мне это кажется правдоподобным, хотя в разложенном сигнале есть некоторый шум.
Следующим тестом будет выяснить,
x_deconv_y
дает ли излучение что-то похожее наx
те частоты, которые динамик не может излучать.Обновление с результатами теста
Мы переделали измерения, описанные выше, используя логарифмическую развертку. Эти результаты показывают, что метод работает.
Проверочный тест состоял из излучения
X / H
и ожиданияX
возврата, то есть равной энергии на всех частотах. Поскольку наихудшая выходная частота примерно на 20 дБ слабее, чем наивысшая, ожидается, что самый высокий выходной уровень будет намного ниже.Сигнал, который был испущен:
Временной ряд и спектрограмма записанного сигнала выглядят так:
источник