অতিস্বনক স্পিকার ক্যালিব্রেশন এবং নির্ধারণ ক্যালিব্রেটেড সংকেত


10

অনুমানযোগ্য সংকেত নির্গমনের লক্ষ্যে আমি একটি অতিস্বনক স্পিকারকে ক্যালিব্রেট করার চেষ্টা করছি, তবে হায় আমি ডিএসপি-ফু এর অভাবে সম্ভবত সমস্যায় পড়ে যাচ্ছি।

একটু ব্যাকগ্রাউন্ড

আমার কাছে থাকা ক্যালিব্রেটেড রেকর্ডিংয়ের সাথে আমি যতটা সম্ভব প্লেব্যাক শোনার পক্ষে সক্ষম হতে চাই। আমি যতক্ষণ তত্ত্বটি বুঝতে পারি, আমার স্পিকার স্থানান্তর ফাংশনটি খুঁজে বের করতে হবে এবং আমি যে সংকেতগুলি দিয়ে এটি প্রকাশ করতে চাই তা ডিকনভলভ করতে হবে। এরকম কিছু (ফ্রিকোয়েন্সি ডোমেনে):

X -> H -> XH

কোথায় Xনির্গত সংকেত Hভাষাভাষী স্থানান্তর ফাংশন হয় এবং XHহয় Xবার H। একটি বিভাগ ( ./) এখন আমাকে দেওয়া উচিত H

এখন, একটি ক্রমাঙ্কিত সংকেত নির্গত করতে, এটি দ্বারা ভাগ করা উচিত H:

X/H -> H -> X

কি হয়েছে

  • ট্রিপডগুলিতে স্পিকার এবং ক্যালিব্রেটেড মাইক্রোফোন 1 মিটার বাদে।
  • রেকর্ড করা 30+ রৈখিক 150KHz-20KHz, 20 মাইল দীর্ঘ, এবং 500 কেএস / সেকেন্ড রেকর্ড করেছে।
  • নীচে মতলব / অকটাভ স্ক্রিপ্টের সাথে সারিবদ্ধ এবং গড় সংকেত, স্ক্রিপ্টের নীচে ফলাফল সংকেত দেখা যায়।
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এবং এখানে mat7- বাইনারি ফর্ম্যাটে Xপাওয়া যাবে

সম্ভবত আমি কেবল ক্লান্ত এবং এখানে একটি সহজ সমাধান রয়েছে, তবে এই মুহূর্তে আমি এটি দেখতে পাচ্ছি না। কোনও সহায়তা / পরামর্শ অনেক প্রশংসা করা হয়।


1
এই থ্রেড - dsp.stackexchange.com/questions/953/… - এবং এই এক- 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নীচে দেখা যায়:

এক্স ক্যান্ভ h এর বর্ণালী এক্স ডেকনভ এইচ এর বর্ণালী

এগুলি আমার কাছে প্রশংসনীয় বলে মনে হচ্ছে যদিও ডিকনভলভাল সিগন্যালে কিছুটা আওয়াজ রয়েছে।

পরবর্তী পরীক্ষাটি দেখতে হবে যে নির্গতকরণ স্পিকারটি নির্গত করতে পারে না x_deconv_yএমন fre xফ্রিকোয়েন্সিগুলি বাদ দিয়ে সাদৃশ্যযুক্ত কিছু দেয় কিনা ।

পরীক্ষার ফলাফল সহ আপডেট করুন

আমরা লোগারিদমিক ডাউন ডাউন-সুইপ ব্যবহার করে উপরে বর্ণিত পরিমাপগুলি পুনরায় ভাগ করেছি। এই ফলাফলগুলি পদ্ধতিটি কাজ করে বলে মনে হয়।

যাচাই পরীক্ষাটি নির্গমন করে X / Hএবং Xফিরে আসার প্রত্যাশায় অন্তর্ভুক্ত , অর্থাৎ সমস্ত ফ্রিকোয়েনিতে সমান শক্তি। সবচেয়ে খারাপ আউটপুট ফ্রিকোয়েন্সি সর্বোত্তম থেকে প্রায় 20 ডিবি দুর্বল হওয়ায় সর্বাধিক আউটপুট স্তরটি এত কম হবে বলে আশা করা হচ্ছে।

যে সিগন্যালটি নির্গত হয়েছিল:

নির্গত সংকেত সময় সিরিজ

রেকর্ড করা সংকেতের টাইম সিরিজ এবং বর্ণালী এই জাতীয় চেহারা:

নির্গত সংকেত সময় সিরিজ নির্গত সংকেত সময় সিরিজ


এ সম্পর্কে কোন আপডেট? আপনি সিগন্যাল চেহারাটি কীভাবে নির্গমন করলেন?
ল্যান্স

@ বাস্ক: আগ্রহের জন্য ধন্যবাদ। যন্ত্রপাতি অন্য কোথাও ব্যবহৃত হওয়ায় এখনও এটি পরীক্ষা করার সুযোগ পাইনি। আমি পরীক্ষাটি পোস্ট করার পরে ফলাফল পোস্ট করব।
থোর

@ বাস্ক: আমরা এখন এটি পরীক্ষা করেছি এবং দেখে মনে হচ্ছে :-)।
থর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.