초음파 스피커 보정 및 보정 된 신호 방출


10

예측 가능한 신호를 방출하기 위해 초음파 스피커를 보정하려고하지만 DSP-fu가 없기 때문에 문제가 계속 발생합니다.

작은 배경

보정 된 녹음에 최대한 가깝게 사운드를 재생할 수 있기를 원합니다. 이론을 이해하는 한, 스피커 전송 기능을 찾아서 방출하고자하는 신호를 분리해야합니다. 주파수 영역에서 이와 같은 것 :

X -> H -> XH

여기서 X방출 된 신호는 H스피커 전달 함수이고 XH이다 X시간 H. ./이제 부서 ( )가 나에게 줄 것 H입니다.

이제 교정 된 신호를 방출하려면 다음과 같이 나누어야합니다 H.

X/H -> H -> X

완료된 사항

  • 삼각대에서 1m 떨어진 스피커와 보정 된 마이크를 배치했습니다.
  • 기록 된 30+ 선형 스위프는 150KHz-20KHz, 20ms 길이이며 @ 500 KS / s로 기록되었습니다.
  • 아래의 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);

정렬 및 평균 신호

  • 푸리에 (Fourier) 는 위에서 언급 한 계산을 변형 X하고 수행 XH했으며 그 결과는 그럴듯 ​​해 보인다. 아래는 H(보라색)과 X/H(녹색) 의 정규화 된 음모입니다 .

    H와 X / H의 주파수 도표

플롯이 관련 주파수로 잘 렸습니다.

내가 잘못 가고 있다면 알려주세요.

내 질문

계산 후 X/H시간 도메인으로 다시 변환해야한다고 생각했는데 이것이 간단 ifft(X./H)하고 가정 wavwrite했지만 지금까지의 모든 시도는 그럴듯한 대답을 얻지 못했습니다. 주파수 벡터 Hf, HX찾을 수 있습니다 여기 mat7 바이너리 형식으로.

어쩌면 피곤하고 여기에 간단한 해결책이 있지만 현재는 볼 수 없습니다. 모든 도움 / 조언을 부탁드립니다.


1
이 스레드 - dsp.stackexchange.com/questions/953/... -이 원 - dsp.stackexchange.com/questions/2705/...은 - 당신에게 유용 할 수 있습니다.
짐 클레이

네, 내 실수로 고마워요. 나는 신호의 크기 만 고려하고 있었으며, 이는 위상이 0 인 시간 신호가됩니다. 지금 올바른 결과를 얻은 것 같으며 답으로 추가하겠습니다.
Thor

답변:


3

Jim Clay가 주석에서 언급 한 참고 문헌을보고 답을 찾았습니다 .Jim에게 감사드립니다.

제로 위상 신호를 초래하고 방출에는 눈에 띄게 사용될 수없는 크기 만 고려하는 실수를했습니다.

내가 마침내 사용했던 코드는 아래에서 볼 수 있습니다.

이 스크립트는 시간 도메인 신호를 소문자로, 주파수 도메인 신호를 대문자로 유지하는 명명 규칙을 준수합니다.

% 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 전환율의 스펙트로 그램 x deconv h의 스펙트로 그램

deconvolved 신호에 약간의 노이즈가 있지만 이것들은 나에게 그럴듯 해 보입니다.

다음 테스트는 방출이 스피커가 방출 할 수없는 주파수를 방해하는 x_deconv_y것이 있는지 확인 x하는 것입니다.

테스트 결과로 업데이트

우리는 로그 다운 스윕을 사용하여 위에서 설명한 측정 값을 다시 작성했습니다. 이 결과는 방법이 효과가 있음을 시사하는 것 같습니다.

검증 테스트 는 모든 주파수에서 동일한 에너지 X / H를 방출 하고 X회복하는 것으로 구성되었습니다 . 최악의 출력 주파수는 최고보다 약 20dB 약하기 때문에 최고 출력 레벨은 훨씬 낮을 것으로 예상됩니다.

방출 된 신호 :

방출 된 신호의 시계열

기록 된 신호의 시계열 및 스펙트로 그램은 다음과 같습니다.

방출 된 신호의 시계열 방출 된 신호의 시계열


이것에 대한 업데이트? 신호를 어떻게 보냈습니까?
랜스

@Busk : 관심을 가져 주셔서 감사합니다. 장비가 다른 곳에서 사용되고 있기 때문에 아직 테스트 할 기회가 없었습니다. 테스트를 마치면 결과를 게시하겠습니다.
Thor

@Busk : 우리는 이제 그것을 테스트했으며 작동하는 것 같습니다 :-).
Thor
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.