ফ্র্যাচ্জেজ ফাংশন ব্যতীত আমি কীভাবে ম্যাটল্যাবে ব্যান্ডপাস বাটারওয়ার্থ ফিল্টারটির ফ্রিকোয়েন্সি প্রতিক্রিয়াটিকে ম্যানুয়ালি প্লট করব?


15

আমার নীচের মতো কোড রয়েছে যা একটি সিগন্যালে ব্যান্ডপাস ফিল্টার প্রয়োগ করে। আমি ডিএসপিতে বেশ নুবি এবং আমি এগিয়ে যাওয়ার আগে পর্দার আড়ালে কী ঘটছে তা বুঝতে চাই।

এটি করতে, আমি কীভাবে ফিল্টারটির ফ্রিকোয়েন্সি প্রতিক্রিয়া ব্যবহার না করে প্লট করব তা জানতে চাই freqz

[b, a] = butter(order, [flo fhi]);
filtered_signal = filter(b, a, unfiltered_signal)

আউটপুটগুলি দেওয়া [b, a]হল আমি কীভাবে এটি করব? এটি মনে হয় এটি একটি সহজ কাজ হবে তবে ডকুমেন্টেশন বা অনলাইনে আমার কী প্রয়োজন তা খুঁজে পেতে আমার বেশ কষ্ট হচ্ছে।

আমি কীভাবে এটি সম্ভব তাড়াতাড়ি বুঝতে চাই, যেমন একটি fftবা অন্য দ্রুত অ্যালগরিদম ব্যবহার করে ।

উত্তর:


25

আমরা জানি যে একটি ফিল্টার সাধারণ স্থানান্তর ফাংশন দ্বারা দেওয়া হয়:

এইচ(z- র)=Σ=0এমz- র-Σ=0এনএকটিz- র-

এখন বিকল্প z- র=ωইউনিট বৃত্তে স্থানান্তর ফাংশনটি মূল্যায়নের জন্য কে :

H(ejω)=k=0Mbkejωkk=0Nakejωk

সুতরাং এটি কোনও প্রদত্তটিতে বহুপদী মূল্যায়নের সমস্যা হয়ে দাঁড়ায় ω । পদক্ষেপ এখানে:

  • বর্ণালীর প্রথমার্ধের জন্য কৌণিক ফ্রিকোয়েন্সিগুলির ভেক্টর তৈরি করুন ω=[0,,π] ( 2- তে যাওয়ার প্রয়োজন নেই)2π) এবং এটিকে সংরক্ষণ করুনw
  • প্রাক-গণনা ব্যয়কারী ejω পরিবর্তনশীল তাদের এ সব এবং এটি সংরক্ষণze
  • কল polyvalকরে অঙ্ক এবং ডিনোমিনেটরের মান গণনা করতে ফাংশনটি ব্যবহার করুন : polyval(b, ze)সেগুলি ভাগ করুন এবং এতে সঞ্চয় করুন H। কারণ আমরা প্রশস্ততাতে আগ্রহী, তারপরে ফলাফলটির নিখরচায় মানটি নিই।
  • ডিবি স্কেলে রূপান্তর করুন: এইচবি=20লগ10এইচ - এই ক্ষেত্রে 1 হল রেফারেন্স মান value

কোডগুলিতে সেগুলি সবই রাখা:

%% Filter definition
a = [1 -0.5 -0.25]; % Some filter with lot's of static gain
b = [1 3 2];

%% My freqz calculation
N = 1024; % Number of points to evaluate at
upp = pi; % Evaluate only up to fs/2
% Create the vector of angular frequencies at one more point.
% After that remove the last element (Nyquist frequency)
w = linspace(0, pi, N+1); 
w(end) = [];
ze = exp(-1j*w); % Pre-compute exponent
H = polyval(b, ze)./polyval(a, ze); % Evaluate transfer function and take the amplitude
Ha = abs(H);
Hdb  = 20*log10(Ha); % Convert to dB scale
wn   = w/pi;
% Plot and set axis limits
xlim = ([0 1]);
plot(wn, Hdb)
grid on

%% MATLAB freqz
figure
freqz(b,a)

আসল আউটপুট freqz :

এখানে চিত্র বর্ণনা লিখুন

এবং আমার স্ক্রিপ্টের আউটপুট:

এখানে চিত্র বর্ণনা লিখুন

এবং রৈখিক স্কেলে দ্রুত তুলনা - দুর্দান্ত দেখাচ্ছে!

[h_f, w_f] = freqz(b,a);
figure
xlim = ([0 1]);
plot(w, Ha) % mine
grid on
hold on
plot(w_f, abs(h_f), '--r') % MATLAB
legend({'my freqz','MATLAB freqz'})

এখানে চিত্র বর্ণনা লিখুন

এখন আপনি এটিকে কিছু ফাংশনে পুনর্লিখন করতে পারেন এবং এটি আরও কার্যকর করার জন্য কয়েকটি শর্ত যুক্ত করতে পারেন।


আর একটি উপায় (পূর্বে প্রস্তাবিত আরও নির্ভরযোগ্য) হ'ল মৌলিক সম্পত্তি ব্যবহার করা, কোনও ফিল্টারের ফ্রিকোয়েন্সি প্রতিক্রিয়া হ'ল তার আবেগ প্রতিক্রিয়ার ফুরিয়ার ট্রান্সফর্ম:

এইচ(ω)=এফ{(টি)}

δ(টি)

d = [zeros(1,length(w_f)) 1 zeros(1,length(w_f)-1)];
h = filter(b, a, d);
HH = abs(fft(h));
HH = HH(1:length(w_f));

তুলনায় এটি নিম্নলিখিত উত্পাদন করবে:

এখানে চিত্র বর্ণনা লিখুন


1
বিস্তারিত ব্যাখ্যা
partida

আমি এই লাইন চিন্তা করছি a = [1 -0.5 -0.25]; % Some filter with lot's of static gain। দয়া করে এখানে এই পরামিতিগুলির নির্বাচন সম্পর্কে আমাকে ব্যাখ্যা করতে পারেন। আমি আমার মতলবের ম্যানুয়ালটি পড়ছি এবং এটি [h,w] = freqz(hfilt,n)সিন্যাপসের এক অংশে বলেছে । আপনি দুটি ফিল্টার দিচ্ছেন (ক, খ) freqz। উভয় ফিল্টার আছে hfilt? নাকি একজন n?
ল্যাও লোপল্ড হার্টজ

অন্যের জন্য কেবল স্পষ্ট করে বলতে: "2 পাই পর্যন্ত যাওয়ার দরকার নেই" যখন সহগগুলি বাস্তব হয়। জটিল সহগের সাথে ফিল্টারগুলির জন্য অ্যাপ্লিকেশন রয়েছে এবং সে ক্ষেত্রে বর্ণালী আর প্রতিসাম্যযুক্ত হবে না এবং সেই ক্ষেত্রে ফ্রিকোয়েন্সিটি 2 পিআই পর্যন্ত বাড়িয়ে দিতে চাইবে।
ড্যান বসচেন

14

এটি হ'ল জোজেকের উত্তরের একটি সংযোজন যা ডাবল-স্পষ্টতা গণিত ব্যবহার করা হলে আরও সাধারণ এবং পুরোপুরি ভাল। যখন কম নির্ভুলতা থাকে, তখন একটি "কোসাইন সমস্যা" দেখা দেয় যা যখন হয় তখন ফ্রিকোয়েন্সি প্রতিক্রিয়াটির ফ্রিকোয়েন্সি খুব কম হয় (নাইকুইস্টের তুলনায় অনেক কম) এবং এছাড়াও যখন ফিল্টারটির অনুরণন ফ্রিকোয়েন্সি খুব কম থাকে।

|H(ejω)|2|H(ejω)|=|H(ejω)|

এই ট্রিগার পরিচয় বিবেচনা করুন:

cos(ω) = 12sin2(ω2)

sin2(ω2)ω0 । এত ছোট যে শব্দটি এবং সেই শব্দটির ফ্রিকোয়েন্সি তথ্য 1 টিতে যুক্ত হয়ে গেলে (বা এটি নেতিবাচক) হারিয়ে যাচ্ছে, এটি ভাসমান পয়েন্টের ক্ষেত্রেও, তবে ডাবল-স্পষ্টতা ভাসা নিয়ে সমস্যা কম less তবে আমাদের মধ্যে কারও কারও এই ফ্রিকোয়েন্সি প্রতিক্রিয়া ফাংশনটি গিয়ারে রেখে দ্বি-নির্ভুলতা ভাসমান পয়েন্ট বা কোনও ভাসমান বিন্দুর সংস্থান থাকতে পারে।

sin2(ω2)

H(z)=b0+b1z1+b2z2a0+a1z1+a2z2

যার জটিল ফ্রিকোয়েন্সি প্রতিক্রিয়া রয়েছে

H(ejω)=b0+b1ejω+b2ej2ωa0+a1ejω+a2ej2ω

যার দৈর্ঘ্যের স্কোয়ার রয়েছে:

|H(ejω)|2=|b0+b1ejω+b2ej2ω|2|a0+a1ejω+a2ej2ω|2=(b0+b1cos(ω)+b2cos(2ω))2+(b1sin(ω)+b2sin(2ω))2(a0+a1cos(ω)+a2cos(2ω))2+(a1sin(ω)+a2sin(2ω))2=b02+b12+b22+2b1(b0+b2)cos(ω)+2b0b2cos(2ω)a02+a12+a22+2a1(a0+a2)cos(ω)+2a0a2cos(2ω)

so, one can see that the magnitude frequency response |H(ejω)| is an even symmetry function and depends only on the cosines cos(ω) and cos(2ω). for very low ω, the values of those cosines are so close to 1 that, with single-precision fixed or floating point, there are few bits remaining that differentiate those values from 1. that is the "cosine problem".

using the trig identity above, you get for magnitude squared:

|H(ejω)|2=b02+b12+b22+2b1(b0+b2)cos(ω)+2b0b2cos(2ω)a02+a12+a22+2a1(a0+a2)cos(ω)+2a0a2cos(2ω)=b02+b12+b22+2b1(b0+b2)(12sin2(ω2))+2b0b2(12sin2(ω))a02+a12+a22+2a1(a0+a2)(12sin2(ω2))+2a0a2(12sin2(ω))=b02+b12+b22+2b1(b0+b2)(12sin2(ω2))+2b0b2(2cos2(ω)1)a02+a12+a22+2a1(a0+a2)(12sin2(ω2))+2a0a2(2cos2(ω)1)=b02+b12+b22+2b1(b0+b2)(12sin2(ω2))+2b0b2(2(12sin2(ω2))21)a02+a12+a22+2a1(a0+a2)(12sin2(ω2))+2a0a2(2(12sin2(ω2))21)=b02+b12+b22+2b1(b0+b2)(12ϕ)+2b0b2(2(12ϕ)21)a02+a12+a22+2a1(a0+a2)(12ϕ)+2a0a2(2(12ϕ)21)=b02+b12+b22+2b1(b0+b2)(12ϕ)+2b0b2(18ϕ+8ϕ2)a02+a12+a22+2a1(a0+a2)(12ϕ)+2a0a2(18ϕ+8ϕ2)=b02+b12+b22+2b1b0+2b1b24(b1b0+b1b2)ϕ+2b0b216b0b2ϕ+16b0b2ϕ2a02+a12+a22+2a1a0+2a1a24(a1a0+a1a2)ϕ+2a0a216a0a2ϕ+16a0a2ϕ2=(b02+b12+b22+2b1b0+2b1b2+2b0b2)4(b1b0+b1b24b0b2)ϕ+16b0b2ϕ2(a02+a12+a22+2a1a0+2a1a2+2a0a2)4(a1a0+a1a24a0a2)ϕ+16a0a2ϕ2=14(b02+b12+b22+2b1b0+2b1b2+2b0b2)(b1b0+b1b24b0b2)ϕ+4b0b2ϕ214(a02+a12+a22+2a1a0+2a1a2+2a0a2)(a1a0+a1a24a0a2)ϕ+4a0a2ϕ2=(b0+b1+b22)2ϕ(4b0b2(1ϕ)+b1(b0+b2))(a0+a1+a22)2ϕ(4a0a2(1ϕ)+a1(a0+a2))

where ϕsin2(ω2)

if your gear is intending to plot this as dB, it comes out as

20log10|H(ejω)| = 10log10((b0+b1+b22)2ϕ(4b0b2(1ϕ)+b1(b0+b2)))10log10((a0+a1+a22)2ϕ(4a0a2(1ϕ)+a1(a0+a2)))

so your division turns into subtraction, but you have to be able to compute logarithms to some base or another. numerically, you will have much less trouble with this for low frequencies than doing it the apparent way.


2
That's really cool, thank you Robert! +1
jojek

@Robert I "believe" similar to my comment for Jojek above that this only applies as well when the coefficients are real (and therefore the spectrum is symmetric and thus the magnitude converts to cosines as you show)... Am I correct?
Dan Boschen

yes. that commitment is made when you go from the first line of |H(ejω)|2=... to the second line. no going back after that.
robert bristow-johnson
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.