उच्च क्रम फिल्टर के लिए biquad वर्गों को कैस्केडिंग कैसे करता है?


20

मैं एक 8 वें क्रम IIR फ़िल्टर और प्रत्येक एप्लिकेशन नोट और मेरे द्वारा पढ़ी गई पाठ्यपुस्तक को लागू करने की कोशिश कर रहा हूं, यह कहता है कि 2 से अधिक क्रम के किसी भी फ़िल्टर को दूसरे क्रम खंडों के रूप में लागू करना सबसे अच्छा है। मैंने tf2sosMATLAB का इस्तेमाल दूसरे ऑर्डर सेक्शन के लिए गुणांक प्राप्त करने के लिए किया, जिसने मुझे उम्मीद के मुताबिक 4 सेकंड के ऑर्डर सेक्शन के लिए 6x4 कोफ़े दिए। एसओएस के रूप में लागू करने से पहले, 8 वें ऑर्डर फिल्टर को संग्रहीत करने के लिए 7 पिछले नमूना मूल्यों (और साथ ही आउटपुट मान) की आवश्यकता होती है। अब दूसरे क्रम खंडों के रूप में कार्यान्वित होने पर इनपुट से आउटपुट तक प्रवाह कैसे काम करता है, क्या मुझे केवल 2 पिछले नमूना मूल्यों को संग्रहीत करने की आवश्यकता है? या पहले फिल्टर के आउटपुट के रूप x_inमें दूसरे फिल्टर और इतने पर फ़ीड करता है?


यू को उस अवस्था में फिल्टर के क्रम के आधार पर हर चरण के लिए पिछले राज्यों को संग्रहीत करने की आवश्यकता है, इसलिए यह सिर्फ 2 नहीं होगा जैसा कि यू उल्लेख किया गया है

जवाबों:


13

यह आखिरी बात है जो आपने कही थी ("या दूसरे फिल्टर में x_in के रूप में पहले फिल्टर फ़ीड का उत्पादन होता है और इसी तरह से?")। विचार सरल है: आप बाइकेड्स को अलग-अलग क्रम के फिल्टर के रूप में मानते हैं जो कैस्केड में हैं। पहले फ़िल्टर से आउटपुट दूसरे पर इनपुट है, और इसी तरह, इसलिए देरी की लाइनें फिल्टर के बीच फैली हुई हैं। यदि आपको स्मृति-विवश वातावरण में संरचना को अनुकूलित करने की आवश्यकता है, तो आप ध्यान दे सकते हैं कि आसन्न बाइकेड्स में अनावश्यक विलंब मेमोरी है (अर्थात चरण 1 के पिछले कुछ आउटपुट नमूने चरण 2 के अंतिम कुछ इनपुट नमूनों के समान हैं, इसलिए डॉन) 'आपको उन्हें अलग-अलग स्टोर करना होगा जैसे कि यदि आप केवल आइसोलेशन में फ़िल्टर लागू करते हैं)।


धन्यवाद! मैं बस जल्दी से MATLAB में यह करने में कामयाब रहा। पहले भ्रम का कारण यह था कि मैं लाभ (ऊग!) गुणा करना भूल गया था और इसलिए सभी प्रकार के विचारों में
कमी आने

यदि आप tf2sos (जैसे मेरा उदाहरण कोड पोस्ट) से आउटपुट आर्ग के रूप में लाभ के लिए पूछने से परेशान नहीं हैं, तो आपको इसे फिर से वापस गुणा करने की आवश्यकता नहीं है।
सीखे

9

दूसरे क्रम खंडों को लागू करने के लिए वास्तव में दो तरीके हैं: समानांतर और धारावाहिक। धारावाहिक संस्करण में, सेक्शन N के आउटपुट सेक्शन N + 1 के इनपुट हैं। समानांतर संस्करण में सभी खंडों में समान इनपुट होता है (और संयुग्मित जटिल युग्म के बजाय केवल एक वास्तविक शून्य होता है) और प्रत्येक अनुभाग का आउटपुट केवल संक्षेप में होता है। दो तरीके जेड-डोमेन ट्रांसफर फ़ंक्शन के आंशिक-आंशिक विस्तार के माध्यम से संबंधित हैं। चेतावनी: यह एक संख्यात्मक रूप से मुश्किल समस्या है और मानक मटलैब कार्यान्वयन "रेसिड्यूज़" में विशिष्ट ऑडियो फिल्टर के लिए बहुत बड़ी संख्यात्मक त्रुटियां हो सकती हैं, जो इकाई चक्र के करीब पोल हैं।


6

यहां यह दिखाने के लिए थोड़ा डेमो कोड है कि आप द्वितीय क्रम खंडों को बेहतर क्यों बना रहे हैं।

clc

sr = 44100;
order = 13;

[b,a] = butter(order,1000/(sr/2),'low');
[sos] = tf2sos(b,a);

x = [1; zeros(299,1)]; %impulse


% all in one
Y = filter(b,a,x);

% cascaded biquads
Z = x;
for nn = 1:size(sos,1);
    Z = filter(sos(nn,1:3),sos(nn,4:6), Z );
end


cla; plot(Y, 'k'); hold on; plot(Z,':r'); hold off

लगभग 12 से 13 के आदेशों के अनुसार, उपरोक्त उदाहरण में दिए गए लोपास फ़िल्टर के लिए, संख्यात्मक त्रुटियां कार्यान्वयन के लिए एक अलग-अलग आवेग प्रतिक्रिया देने के लिए निर्मित होती हैं जो कैस्केड किए गए बीकाड का उपयोग नहीं करता है। फ़िल्टर के आधार पर, आपका माइलेज अलग-अलग होगा।

आदेश = 10

यहां छवि विवरण दर्ज करें

आदेश = 13

यहां छवि विवरण दर्ज करें


@learvst मुझे सही करें अगर मैं गलत हूं, लेकिन आपका कोड लाभ हासिल करता है। ऐसा नहीं होना चाहिए:[sos gain] = tf2sos(b,a); // Rest of code for nn = 1:size(sos,1); Z = filter(sos(nn,1:3),sos(nn,4:6), Z ); end Z = filter(gain,1,Z);
user915783
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.