سؤال

غالبًا ما تحتوي برامج تحرير ومعالجة الرسومات والصوت على وظائف تسمى "مرشح التمرير العالي" و"مرشح التمرير المنخفض".ما الذي تفعله هذه العناصر بالضبط، وما هي الخوارزميات اللازمة لتنفيذها؟

هل كانت مفيدة؟

المحلول

ويكيبيديا:

تشير هذه المصطلحات "العالية" و"المنخفضة" و"النطاق" إلى الترددات.في التمرير العالي، تحاول إزالة الترددات المنخفضة.في تمريرة منخفضة، تحاول إزالة عالية.في تمرير النطاق، أنت تسمح فقط ببقاء نطاق ترددي مستمر.

يعتمد اختيار تردد القطع على طلبك.يمكن إجراء ترميز هذه المرشحات إما عن طريق محاكاة دوائر RC أو عن طريق اللعب بتحويلات فورييه لبياناتك المستندة إلى الوقت.راجع مقالات ويكيبيديا للحصول على أمثلة التعليمات البرمجية.

نصائح أخرى

إليك كيفية تنفيذ مرشح الترددات المنخفضة باستخدام الالتفاف:

double[] signal = (some 1d signal);
double[] filter = [0.25 0.25 0.25 0.25]; // box-car filter
double[] result = new double[signal.Length + filter.Length + 1];

// Set result to zero:
for (int i=0; i < result.Length; i++) result[i] = 0;

// Do convolution:
for (int i=0; i < signal.Length; i++) 
  for (int j=0; j < filter.Length; j++)
    result[i+j] = result[i+j] + signal[i] * filter[j];

لاحظ أن المثال مبسط للغاية.لا يقوم بفحص النطاق ولا يتعامل مع الحواف بشكل صحيح.يعتبر الفلتر المستخدم (صندوق السيارة) مرشحًا سيئًا بشكل خاص، لأنه سيسبب الكثير من التشويش (الرنين).اقرأ عن تصميم الفلتر.

يمكنك أيضًا تنفيذ المرشحات في مجال التردد.إليك كيفية تنفيذ مرشح التمرير العالي باستخدام FFT:

double[] signal = (some 1d signal);
// Do FFT:
double[] real;
double[] imag;
[real, imag] = fft(signal)

// Set the first quarter of the real part to zero to attenuate the low frequencies
for (int i=0; i < real.Length / 4; i++) 
  real[i] = 0;

// Do inverse FFT:
double[] highfrequencysignal = inversefft(real, imag);

مرة أخرى، هذا مبسط، لكنك حصلت على الفكرة.لا يبدو الرمز معقدًا مثل الرياضيات.

وهي بشكل عام دوائر كهربائية تميل إلى تمرير أجزاء من الإشارات التناظرية.يميل التمرير العالي إلى إرسال المزيد من الأجزاء ذات التردد العالي ويميل التمرير المنخفض إلى تمرير المزيد من الأجزاء ذات التردد المنخفض.

ويمكن محاكاتها في البرمجيات.يمكن أن يعمل متوسط ​​المشي كمرشح تمرير منخفض على سبيل المثال، ويمكن أن يعمل الفرق بين متوسط ​​المشي ومدخله كمرشح تمرير عالي.

تمريرة عالية يتيح لك التصفية عالي-التردد (معلومات مفصلة / محلية) يمر.
تمرير منخفض يتيح لك التصفية قليل-التردد (معلومات خشنة/خشنة/عالمية) يمر.

يصف التصفية عملية معالجة البيانات بطريقة تطبق مستويات مختلفة من التوهين على ترددات مختلفة داخل البيانات.

سيطبق مرشح التمرير العالي الحد الأدنى من التوهين (على سبيل المثال.تترك المستويات دون تغيير) للترددات العالية، ولكنها تطبق أقصى قدر من التوهين على الترددات المنخفضة.

مرشح التمرير المنخفض هو العكس - فهو لن يطبق أي توهين على الترددات المنخفضة عن طريق تطبيق التوهين على الترددات العالية.

هناك عدد من خوارزميات التصفية المختلفة المستخدمة.ربما يكون أبسطهما هو مرشح الاستجابة النبضية المحدودة (المعروف أيضًا باسم.مرشح FIR) ومرشح الاستجابة النبضية اللانهائية (المعروف أيضًا باسم.مرشح آي آر).

يعمل مرشح FIR عن طريق الاحتفاظ بسلسلة من العينات وضرب كل من تلك العينات بمعامل ثابت (والذي يعتمد على الموضع في السلسلة).يتم تجميع نتائج كل من هذه الضربات وتكون مخرجات تلك العينة.يُشار إلى هذا باسم "التراكم المضاعف" - وفي أجهزة DSP المخصصة توجد تعليمات MAC محددة للقيام بذلك.

عند أخذ العينة التالية، يتم إضافتها إلى بداية السلسلة، وتتم إزالة العينة الأقدم في السلسلة، وتكرر العملية.

يتم إصلاح سلوك المرشح من خلال اختيار معاملات المرشح.

أحد أبسط المرشحات التي يتم توفيرها غالبًا بواسطة برامج معالجة الصور هو مرشح المتوسط.يمكن تنفيذ ذلك بواسطة مرشح FIR عن طريق ضبط جميع معاملات المرشح على نفس القيمة.

إليك مثال بسيط للغاية لمرشح تمرير منخفض في لغة C++‎ يعالج الإشارة بعينة واحدة في كل مرة:

float lopass(float input, float cutoff) {
 lo_pass_output= outputs[0]+ (cutoff*(input-outputs[0])); 
outputs[0]= lo_pass_output;
return(lo_pass_output);
}

هنا نفس الشيء تقريبًا، باستثناء التمريرة العالية:

float hipass(float input, float cutoff) {
 hi_pass_output=input-(outputs[0] + cutoff*(input-outputs[0]));
 outputs[0]=hi_pass_output;
 return(hi_pass_output);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top