কীভাবে ডিজিটাল দোলনা প্রয়োগ করবেন?


20

আমার কাছে একটি ভাসমান-পয়েন্ট ডিজিটাল সিগন্যাল প্রসেসিং সিস্টেম রয়েছে যা x86-64 প্রসেসর ব্যবহার করে প্রতি সেকেন্ডে গুলি=32768 নমুনার একটি নির্দিষ্ট নমুনা হারে পরিচালনা করে। Assuming যে ডিএসপি সিস্টেম সিঙ্ক্রোনাস যাই হোক না কেন বিষয়ে লক করা আছে, কিছু ফ্রিকোয়েন্সিতে একটি ডিজিটাল অসিলেটর বাস্তবায়ন সবচেয়ে ভালো উপায় কি ?

: বিশেষ করে, আমি সংকেত জেনারেট করতে চান

Y(টি)=পাপ(2πটি)
যেখানে টি=এন/গুলি নমুনা সংখ্যার জন্য এন

একটি ধারণা হ'ল একটি ভেক্টর ট্র্যাক রাখা (এক্স,Y)যা আমরা প্রতিটি ঘড়ির চক্রে একটি কোণ Δφ=2π/গুলি ঘোরাই।

মতলব সিউডোকোড বাস্তবায়ন হিসাবে (আসল বাস্তবায়ন সি তে রয়েছে):

%% Initialization code

f_s = 32768;             % sample rate [Hz]
f = 19.875;              % some constant frequency [Hz]

v = [1 0];               % initial condition     
d_phi = 2*pi * f / f_s;  % change in angle per clock cycle

% initialize the rotation matrix (only once):
R = [cos(d_phi), -sin(d_phi) ; ...
     sin(d_phi),  cos(d_phi)]

তারপরে, প্রতিটি ঘড়ির চক্রে, আমরা ভেক্টরটিকে কিছুটা আবর্তিত করি:

%% in-loop code

while (forever),
  v = R*v;        % rotate the vector by d_phi
  y = v(1);       % this is the sine wave we're generating
  output(y);
end

এটি অসিলেটরকে প্রতি চক্রের জন্য কেবল 4 গুণগুলির সাথে গণনা করতে দেয়। তবে, আমি পর্যায় ত্রুটি এবং প্রশস্ততা স্থায়িত্ব সম্পর্কে উদ্বিগ্ন। (সাধারণ পরীক্ষায় আমি অবাক হয়েছি যে প্রশস্ততা মারা যায়নি বা সঙ্গে সঙ্গে বিস্ফোরণ ঘটে - সম্ভবত sincosনির্দেশটি গ্যারান্টি দেয় পাপ2+ +কোসাইন্2=1))।

এটি করার সঠিক উপায় কী?

উত্তর:


12

আপনি ঠিক বলেছেন যে পুনরাবৃত্তির সংখ্যা ক্রমবর্ধমান হওয়ার সাথে সাথে কঠোরভাবে পুনরাবৃত্ত হওয়া পদ্ধতির ত্রুটি সঞ্চারের পক্ষে ঝুঁকিপূর্ণ। এটির একটি আরও শক্তিশালী উপায় সাধারণত একটি সংখ্যার-নিয়ন্ত্রিত দোলক (এনসিও) ব্যবহার করা । মূলত, আপনার কাছে এমন একটি সংযোজক রয়েছে যা দোলকের তাত্ক্ষণিক পর্বের উপর নজর রাখে, নীচে আপডেট করা:

δ=2πগুলি

φ[এন]=(φ[এন-1]+ +δ)গেলিক ভাষার2π

তত্ক্ষণাত্ তাত্ক্ষণিকভাবে, তারপরে, আপনি এনসিওতে জমে থাকা পর্বকে পছন্দসই সাইনোসয়েডাল আউটপুটগুলিতে রূপান্তর করতে রেখে যান। আপনি এটি কীভাবে গণ্য জটিলতা, নির্ভুলতা ইত্যাদির জন্য আপনার প্রয়োজনীয়তার উপর নির্ভর করে তার একটি সুস্পষ্ট উপায় কেবল আউটপুটগুলি গণনা করা

এক্স[এন]=কোসাইন্(φ[এন])

এক্সগুলি[এন]=পাপ(φ[এন])

আপনার কাছে যে সাইন / কোসাইন রয়েছে তা প্রয়োগ করুন। হাই-থ্রুপুট এবং / বা এম্বেড থাকা সিস্টেমে, পর্যায় থেকে সাইন / কোসাইন মানগুলিতে ম্যাপিং প্রায়শই একটি সন্ধানের টেবিলের মাধ্যমে করা হয়। সন্ধানের টেবিলের আকার (অর্থাত্ সাইন এবং কোসাইন পর্যায়ের আর্গুমেন্টে আপনি কোয়ান্টাইজেশনের পরিমাণটি করেন) মেমরির ব্যবহার এবং আনুমানিক ত্রুটির মধ্যে ট্রেড অফ হিসাবে ব্যবহার করা যেতে পারে। সুন্দর জিনিসটি হ'ল প্রয়োজনীয় পরিমাণ কম্পিউটেশনগুলি সাধারণত টেবিলের আকারের থেকে পৃথক। তদতিরিক্ত, কোসাইন এবং সাইন ফাংশনগুলির অন্তর্নিহিত প্রতিসাম্যের সুযোগ নিয়ে আপনি প্রয়োজনে আপনার LUT আকার সীমাবদ্ধ করতে পারেন; আপনার কেবলমাত্র নমুনাযুক্ত সাইনোসয়েডের সময়ের এক-চতুর্থাংশ সঞ্চয় করতে হবে।

যদি আপনার যুক্তিসঙ্গত আকারের এলটিউইটি আপনাকে দিতে পারে তার চেয়ে উচ্চতর নির্ভুলতার প্রয়োজন হয়, তবে আপনি সর্বদা সারণির নমুনাগুলির (যেমন লিনিয়ার বা ঘনক দ্বিখণ্ডিত, উদাহরণস্বরূপ) মধ্যে বিভাজন দেখতে পারেন।

এই পদ্ধতির আর একটি সুবিধা হ'ল এই কাঠামোর সাথে ফ্রিকোয়েন্সি বা ফেজ মড্যুলেশন অন্তর্ভুক্ত করা তুচ্ছ। আউটপুটটির ফ্রিকোয়েন্সিটি পরিবর্তিত করে তদনুসারে মডিউল করা যায় এবং সরাসরি ϕ [ n ] কে সরাসরি যুক্ত করে ফেজ মড্যুলেশন প্রয়োগ করা যেতে পারে ।δφ[এন]


2
উত্তরের জন্য ধন্যবাদ. কার্যকরভাবে কার্যকর করার সময়টি কীভাবে কয়েক মুখ্য গুণকে sincosতুলনা করে? modঅপারেশনটি দেখার জন্য কি কোনও সম্ভাব্য সমস্যা রয়েছে ?
নিবোট

এটি আবেদন করে যে একই ধাপে-প্রশস্ততা এলটিটি সিস্টেমের সমস্ত দোলকগুলির জন্য ব্যবহার করা যেতে পারে।
নিবোট

মোড 2 পিআই এর উদ্দেশ্য কী? আমি বাস্তবায়নগুলি দেখেছি যা মোড 1.0। আপনি কি মডুলো অপারেশনটির জন্য প্রসারিত করতে পারেন?
বিগব্রাউনবিয়ার 00

1
φ[এন][0,2π)

1
2π[0,1.0)φ[এন]

8

আপনার যা আছে তা খুব ভাল এবং দক্ষ দোলক। সম্ভাব্য সংখ্যাগত ড্রিফট সমস্যাটি আসলে সমাধান করা যেতে পারে। আপনার রাষ্ট্রের পরিবর্তনশীল v এর দুটি অংশ রয়েছে, একটি হ'ল আসল অংশ এবং অন্যটি কাল্পনিক অংশ। এর পরে আর এবং আমি কল করি। আমরা জানি যে r ^ 2 + i ^ 2 = 1। সময়ের সাথে সাথে এটি নিচে নেমে যেতে পারে তবে এটি সহজেই এই মতো লাভ সংশোধন ফ্যাক্টরের সাথে গুণ দ্বারা সংশোধন করা যেতে পারে can

=1R2+ +আমি2

স্পষ্টতই এটি খুব ব্যয়বহুল, তবে আমরা জানি যে লাভ সংশোধনটি unityক্যের খুব কাছাকাছি এবং আমরা সাধারণ টেলর সম্প্রসারণের সাথে এটি প্রায় অনুমান করতে পারি

=1R2+ +আমি212(3-(R2+ +আমি2))

তদুপরি প্রতি একক নমুনায় আমাদের এটি করার দরকার নেই, তবে প্রতি 100 বা 1000 নমুনা একবার স্থিতিশীল রাখার জন্য পর্যাপ্ত পরিমাণের থেকে বেশি। আপনি ফ্রেম ভিত্তিক প্রসেসিংয়ের ক্ষেত্রে এটি বিশেষভাবে কার্যকর। প্রতি ফ্রেমে একবার আপডেট করা ঠিক আছে। এখানে একটি দ্রুত মতলব 10,000,000 নমুনার গণনা করছে।

%% seed the oscillator
% set parameters
f0 = single(100); % say 100 Hz
fs = single(44100); % sample rate = 44100;
nf = 1024; % frame size

% initialize phasor and state
ph =  single(exp(-j*2*pi*f0/fs));
state = single(1 + 0i); % real part 1, imaginary part 0

% try it
x = zeros(nf,1,'single');
testRuns = 10000;
for k = 1:testRuns
  % overall frames
  % sample: loop
  for i= 1:nf
    % phasor multiply
    state = state *ph;
    % take real part for cosine, or imaginary for sine
    x(i) = real(state);
  end
  % amplitude corrections through a taylor exansion aroud
  % abs(state) very close to 1
  g = single(.5)*(single(3)-real(state)*real(state)-imag(state)*imag(state) );
  state = state*g;
end
fprintf('Deviation from unity amplitude = %f\n',g-1);

এই উত্তরটি হিলমার আরও একটি প্রশ্নে আরও ব্যাখ্যা করেছেন: dsp.stackexchange.com/a/1087/34576
sircolinton

7

আপনি যদি এটিকে পুনরাবৃত্তভাবে ভেক্টর ভিটি আপডেট না করেন তবে আপনি অস্থির মাত্রার ড্রিফট এড়াতে পারবেন পরিবর্তে, আপনার প্রোটোটাইপ ভেক্টর ভিটিকে বর্তমান আউটপুট পর্যায়ে ঘোরান। এটি এখনও কিছু ট্রিগ ফাংশন প্রয়োজন, কিন্তু শুধুমাত্র একবার বাফার প্রতি।

কোনও মাত্রার ড্রিফ্ট এবং স্বেচ্ছাসেবী ফ্রিকোয়েন্সি নেই

সুডোকোড:

init(freq)
  precompute Nphasor samples in phasor
  phase=0

gen(Nsamps)
    done=0
    while done < Nsamps:
       ndo = min(Nsamps -done, Nphasor)
       append to output : multiply buf[done:done+ndo) by cexp( j*phase )
       phase = rem( phase + ndo * 2*pi*freq/fs,2*pi)
       done = done+ndo

আপনি যদি কোয়ান্টাইজড ফ্রিকোয়েন্সি অনুবাদটি সহ্য করতে পারেন তবে আপনি বহুগুণ, সিলিএসএক্সের দ্বারা প্রয়োজনীয় ট্রিগ ফাংশন এবং 2pi এর চেয়ে বেশি মডুলাসটি বাদ দিতে পারেন। যেমন 1024 নমুনা ফ্যাসার বাফারের জন্য fs / 1024।

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