
مكتبة مرشحات الاستجابة للاستجابة (IIR) غير المحدودة (IIR) لـ Linux و Mac OSX و Windows والتي تنفذ مرشحات Butterworth و RBJ و ChebyChev ويمكنها بسهولة استيراد معاملات Python (Scipy).
يقوم المرشح بمعالجة عينة البيانات عن طريق عينة لمعالجة الوقت الفعلي.
يستخدم قوالب لتخصيص الذاكرة المطلوبة حتى يمكن تشغيلها دون أي أوامر malloc / جديدة. يتم تخصيص الذاكرة في وقت الترجمة بحيث لا يوجد أبدًا خطر تسرب الذاكرة.
جميع رمز مرشح الوقت الحقيقي موجود في ملفات الرأس التي تضمن التكامل الفعال في البرنامج الرئيسي ويمكن للمترجم تحسين كل من رمز المرشح والبرنامج الرئيسي في نفس الوقت.
أضف ما يلي بيان إلى الكود الخاص بك:
#include "Iir.h"
نهج الترميز العام هو أن المرشح أولاً يتم تحديده لتحديد ترتيبه ، ثم يتم تعيين المعلمات مع setup الوظيفة ، ثم يكون جاهزًا لاستخدامه في عينة بواسطة عينة من التصفية في الوقت الفعلي.
تتمثل الفكرة في تخصيص ذكرى المرشح في وقت الترجم مع وسيطة قالب لتجنب أي أوامر جديدة. هذا يمنع تسرب الذاكرة ويمكن تحسينه في وقت الترجمة. order المقدم للقالب (على سبيل المثال هنا للمرشح المنخفض):
Iir::Butterworth::LowPass<order> f;
يتم استخدامه كترتيب افتراضي بواسطة أمر setup أدناه ولكن يمكن تجاوزه بترتيب أقل إذا لزم الأمر.
setupجميع المرشحات متوفرة كمرشحات منخفضة ، HighPass ، BandStop/Bandstop/Notch. تقدم Butterworth/Chebyshev أيضًا ذي الأكياس المنخفضة/العالية/النطاق مع كسب نطاق مرور محدد وزيادة 0DB في نطاق التوقف.
يمكن أن تكون الترددات إما التناظرية مقابل معدل أخذ العينات أو تلك التي يتم تطبيعها بين 0..1/2 حيث 1/2 هو تردد Nyquist. لاحظ أن الترددات الطبيعية هي ببساطة f = f/fs وهي في وحدات من 1/عينات. داخليًا ، تستخدم المكتبة الترددات الطبيعية وأوامر الإعداد تنقسم ببساطة على معدل أخذ العينات إذا تم إعطاؤه. اختر بين:
setup : معدل أخذ العينات وترددات القطع التناظريةsetupN : الترددات الطبيعية في 1/عينات بين f = 0..1/2 حيث 1/2 = nyquist. يستخدم setup الافتراضي الترتيب المقدم من وسيطة القالب ولكن يمكن تجاوزه بواسطة أوامر المرشح المنخفضة.
راجع ملفات الرأس في iir أو وثائق وسيطات أوامر setup .
الأمثلة أدناه مخصصة للمرشحات المنخفضة:
Butterworth.h مرشح قياسي مناسب لمعظم التطبيقات. استجابة رتابة. const int order = 4; // 4th order (=2 biquads)
Iir::Butterworth::LowPass<order> f;
const float samplingrate = 1000; // Hz
const float cutoff_frequency = 5; // Hz
f.setup (samplingrate, cutoff_frequency);
أو حدد تردد طبيعي بين 0..1/2:
f.setupN(norm_cutoff_frequency);
ChebyshevI.h مع Ripple مسموح بتموج في DB. Iir::ChebyshevI::LowPass<order> f;
const float passband_ripple_in_db = 5;
f.setup (samplingrate,
cutoff_frequency,
passband_ripple_in_dB);
أو حدد تردد طبيعي بين 0..1/2:
f.setupN(norm_cutoff_frequency,passband_ripple_in_dB);
ChebyshevII.h مع رفض أسوأ سائق التوقف في ديسيبل. Iir::ChebyshevII::LowPass<order> f;
double stopband_ripple_in_dB = 20;
f.setup (samplingrate,
cutoff_frequency,
stopband_ripple_in_dB);
أو حدد تردد طبيعي بين 0..1/2:
f.setupN(norm_cutoff_frequency,stopband_ripple_in_dB);
RBJ.h 2nd Order مع Cutoff و Q Factor. Iir::RBJ::LowPass f;
const float cutoff_frequency = 100;
const float Q_factor = 5;
f.setup (samplingrate, cutoff_frequency, Q_factor);
أو حدد تردد طبيعي بين 0..1/2:
f.setupN(norm_cutoff_frequency, Q_factor);
Custom.h ########
# Python
# See "elliptic_design.py" for the complete code.
from scipy import signal
order = 4
sos = signal.ellip(order, 5, 40, 0.2, 'low', output='sos')
print(sos) # copy/paste the coefficients over & replace [] with {}
///////
// C++
// part of "iirdemo.cpp"
const double coeff[][6] = {
{1.665623674062209972e-02,
-3.924801366970616552e-03,
1.665623674062210319e-02,
1.000000000000000000e+00,
-1.715403014004022175e+00,
8.100474793174089472e-01},
{1.000000000000000000e+00,
-1.369778997100624895e+00,
1.000000000000000222e+00,
1.000000000000000000e+00,
-1.605878925999785656e+00,
9.538657786383895054e-01}
};
const int nSOS = sizeof(coeff) / sizeof(coeff[0]); // here: nSOS = 2 = order / 2
Iir::Custom::SOSCascade<nSOS> cust(coeff);
تتم معالجة العينات واحدة تلو الأخرى. في المثال أدناه ، تتم معالجة عينة x باستخدام أمر filter ثم يتم حفظه في y يمكن أن تكون أنواع x و y إما تعويمًا أو مزدوجًا (يُسمح أيضًا بالعدد الصحيح ولكن لا يزال يتم معالجته داخليًا كنقطة عائمة):
y = f.filter(x);
ثم يتم تكرار هذا لكل عينة واردة في حلقة أو معالج الأحداث.
القيم غير الصالحة المقدمة إلى setup() سوف ترمي استثناء. المعلمات المقدمة إلى setup() والتي تؤدي إلى معاملات كونها نان سوف يلقي أيضا استثناء.
يمكنك إيقاف تشغيل معالجة الإخراج من خلال تحديد IIR1_NO_EXCEPTIONS عبر CMAKE أو في برنامجك.
إذا كنت تستخدم cmake كنظام الإنشاء الخاص بك ، فما عليك سوى إضافة إلى CMakeLists.txt الأسطر التالية للمكتبة الديناميكية:
find_package(iir)
target_link_libraries(... iir::iir)
أو للواحد الثابت:
find_package(iir)
target_link_libraries(... iir::iir_static)
اربطها مع المكتبة الديناميكية (UNIX/MAC: -liir ، Windows: iir.lib ) أو المكتبة الثابتة (UNIX/MAC: libiir_static.a ، Windows: libiir_static.lib ).
إذا كنت تستخدم Ubuntu LTS ، فيمكنك تثبيت هذه المكتبة كحزمة مُجسدة مسبقًا.
أضف هذا المستودع إلى نظامك:
sudo add-apt-repository ppa:berndporr/dsp
ثم قم بتثبيت الحزم:
sudo apt install iir1sudo apt install iir1-devإنه متاح ل 64 بت intel و 32،64 بت الذراع (Raspberry Pi إلخ). توثيق حزمة التطوير والمثال في:
/usr/share/doc/iir1-dev/
أداة الإنشاء هي cmake التي تنشئ ملفات Make- أو المشروع للمنصات المختلفة. cmake متاح لـ Linux و Windows و Mac. كما أنه يجمع مباشرة على Raspberry Pi.
يجري
cmake .
الذي يولد makefile. ثم قم بالتشغيل:
make
sudo make install
الذي يقوم بتثبيته تحت /usr/local/lib و /usr/local/include .
تم اختبار كل من CCC و Clang.
cmake -G "Visual Studio 16 2019" -A x64 .
انظر cmake للاختلافات المختلفة. أعلاه لبناء 64 بت. ثم ابدأ Visual C ++ وفتح الحل. سيؤدي ذلك إلى إنشاء ملفات DLL و LIB. تحت Windows ، يوصى بشدة باستخدام المكتبة الثابتة وربطها في برنامج التطبيق.
قم بتشغيل اختبارات الوحدة عن طريق كتابة make test أو مجرد ctest . هذه الاختبار إذا كانت جميع المرشحات بعد نبض دلتا تسترخي إلى الصفر ، وأن مخرجاتها لا تصبح NAN أبدًا ، وإذا كانت المرشحات المباشرة I & II تحسب التسلسلات المتوقعة من خلال مقارنتها من النتائج التي تم إنشاؤها بواسطة إخراج sosfilt من Scipy.
يمكنك تعطيل توليد الاختبارات عن طريق تعيين IIR1_BUILD_TESTING إلى OFF.
أسهل طريقة للتعلم هي من الأمثلة الموجودة في الدليل demo . يتم إرسال نبض دلتا كإشارة اختبار في المرشحات المختلفة وحفظها في ملف. باستخدام Python Script plot_impulse_fresponse.py يمكنك بعد ذلك رسم استجابات التردد.
يمكنك تعطيل تجميع العروض التوضيحية عن طريق تعيين IIR1_BUILD_DEMO إلى OFF.
كما يوفر الدليل الذي يحتوي على اختبارات الوحدة أمثلة لكل نوع من أنواع المرشح.
PDF لجميع الفئات والأساليب ووظائف setup الخاصة موجودة في دليل docs/pdf .
الوثائق عبر الإنترنت هنا: http://berndporr.github.io/iir1
تم إنشاء هذه الردود بواسطة iirdemo.cpp في /demo/ directory ثم رسمها مع plot_impulse_fresponse.py .







تم تطوير هذه المكتبة بشكل أكبر من عمل Vinnie Falco الأصلي الذي يمكن العثور عليه هنا:
https://github.com/vinniefalco/DSPFilters
بينما تقوم المكتبة الأصلية بمعالجة صفائف الصوت ، فقد تم تكييف هذه المكتبة للقيام بعينة معالجة الوقت الفعلي بسرعة حسب العينة. لن يتطلب الأمر setup ترتيب المرشح وبدلاً من ذلك يتذكره من وسيطة القالب. تم تبسيط بنية الفصل وجميع الوظائف الموثقة للدوكسين. بدلاً من وجود بيانات تأكيد () ، يرمي هذا الاستثناءات الاستثناءات في حالة خاطئ المعلمة. تمت إزالة أي تصميم مرشح يتطلب التحسين (على سبيل المثال مرشحات القبهارات) ، وبدلاً من ذلك تمت إضافة وظيفة يمكنها استيراد معاملات بسهولة من Scipy.
Bernd Porr - http://www.berndporr.me.uk