الرئيسية قاعدة المعرفة الرياضيات الهندسية رياضيات معالجة الإشارات الصناعية
الرياضيات الهندسية

رياضيات معالجة الإشارات الصناعية

ما هي معالجة الإشارات الرقمية ولماذا تهمّ المهندس الصناعي؟

كل حساس في المصنع — حرارة، ضغط، اهتزاز، تدفق — يُنتج إشارة كهربائية تحمل معلومات. لكن هذه الإشارة دائماً مخلوطة بـضجيج (Noise): تداخل كهرومغناطيسي من المحركات، اهتزازات ميكانيكية، أو تشويش من خطوط الطاقة.

معالجة الإشارات الرقمية (Digital Signal Processing - DSP) هي مجموعة الأدوات الرياضية التي تفصل المعلومة المفيدة عن الضجيج، وتستخرج أنماطاً مخفية، وتضغط البيانات للنقل والتخزين.

في هذا الدرس سنتعلّم الأسس الرياضية لـ DSP بأمثلة عملية من بيئة المصنع.

نظرية العيّنات (Sampling Theorem): أساس التحويل الرقمي

عندما نحوّل إشارة تماثلية (analog) إلى رقمية (digital)، نأخذ عيّنات (samples) منها على فترات منتظمة. السؤال الجوهري: كم عيّنة في الثانية نحتاج؟

نظرية نايكويست-شانون تقول:

fs ≥ 2 * fmax

حيث fs هو تردد العيّنات (Sampling Frequency) و fmax هو أعلى تردد في الإشارة. التردد fs/2 يسمى تردد نايكويست (Nyquist Frequency).

مثال عملي: حساس اهتزاز على محمل كروي (bearing) يقيس ترددات حتى 5 kHz:

# الحد الأدنى لتردد العيّنات
f_max = 5000  # Hz (أعلى تردد اهتزاز)
fs_min = 2 * f_max  # 10,000 Hz

# عملياً نستخدم 2.5x على الأقل لهامش أمان
fs_practical = int(2.5 * f_max)  # 12,500 Hz

print(f"الحد الأدنى النظري: {fs_min} Hz")
print(f"تردد العيّنات العملي: {fs_practical} Hz")
print(f"الفترة بين العيّنات: {1/fs_practical * 1e6:.1f} μs")

الطيّ الترددي (Aliasing): الخطأ القاتل

ماذا يحدث إذا أخذنا عيّنات بتردد أقل من نايكويست؟ الترددات العالية تظهر مقلوبة كترددات منخفضة وهمية — وهذا يسمى الطيّ الترددي (Aliasing).

تخيّل عجلة سيارة في فيلم تبدو وكأنها تدور للخلف — نفس الظاهرة بالضبط. الكاميرا (تردد العيّنات) أبطأ من دوران العجلة (تردد الإشارة).

import numpy as np

# إشارة حقيقية: 800 Hz
f_signal = 800  # Hz

# عيّنات بتردد 1000 Hz (أقل من 2 * 800)
fs_bad = 1000
t_bad = np.arange(0, 0.01, 1/fs_bad)
samples_bad = np.sin(2 * np.pi * f_signal * t_bad)

# التردد الوهمي الناتج عن الطيّ
f_alias = abs(f_signal - fs_bad)  # 200 Hz!
print(f"التردد الحقيقي: {f_signal} Hz")
print(f"تردد العيّنات: {fs_bad} Hz")
print(f"التردد الوهمي (alias): {f_alias} Hz")
print("ستظهر الإشارة وكأنها 200 Hz بدلاً من 800 Hz!")

# الحل: مرشح مضاد للطي (Anti-aliasing filter) قبل ADC
# ثم عيّنات كافية
fs_good = 2000  # أكبر من 2 * 800
print(f"\nتردد العيّنات الصحيح: {fs_good} Hz (> 2 × {f_signal})")

الحل العملي: دائماً استخدم مرشح تمرير منخفض (Anti-aliasing filter) قبل المحوّل التماثلي-الرقمي (ADC) لإزالة الترددات فوق نايكويست.

تحويل Z: أداة تحليل المرشحات الرقمية

كما أن تحويل لابلاس يُبسّط تحليل الأنظمة التماثلية، تحويل Z يفعل نفس الشيء للأنظمة الرقمية. يحوّل معادلات الفروق (difference equations) إلى معادلات جبرية.

X(z) = Σ x[n] * z^(-n)    (n من 0 إلى ∞)

حيث z هو متغير مركّب. الخصائص الأساسية:

الخاصية مجال الزمن مجال Z
التأخير بعيّنة x[n-1] z^(-1) * X(z)
التأخير بعيّنتين x[n-2] z^(-2) * X(z)
الطي (Convolution) x[n] * h[n] X(z) * H(z)

لماذا مهم؟ دالة النقل (Transfer Function) لأي مرشح رقمي تُكتب بدلالة z:

H(z) = (b0 + b1*z^(-1) + b2*z^(-2)) / (1 + a1*z^(-1) + a2*z^(-2))

مرشح FIR: استجابة نبضية محدودة

FIR (Finite Impulse Response) هو مرشح يعتمد فقط على العيّنات الحالية والسابقة من المدخل:

y[n] = b0*x[n] + b1*x[n-1] + b2*x[n-2] + ... + bN*x[n-N]

مميزاته:

  • مستقر دائماً (لا يمكن أن ينفجر)
  • يمكن تصميمه بطور خطي (linear phase) — لا يشوّه شكل الإشارة
  • سهل التنفيذ على المتحكمات الدقيقة

عيوبه: يحتاج عدد معاملات أكبر لنفس الحدّة مقارنة بـ IIR.

import numpy as np

def fir_filter(x, coefficients):
    """مرشح FIR بسيط"""
    N = len(coefficients)
    y = np.zeros(len(x))
    for n in range(len(x)):
        for k in range(N):
            if n - k >= 0:
                y[n] += coefficients[k] * x[n - k]
    return y

# مرشح متوسط متحرك (أبسط FIR) — 5 نقاط
coefficients = [0.2, 0.2, 0.2, 0.2, 0.2]

# إشارة حساس حرارة مع ضجيج
np.random.seed(42)
t = np.arange(100)
signal_clean = 75.0 + 0.1 * t  # حرارة ترتفع تدريجياً
noise = np.random.normal(0, 2, 100)  # ضجيج عشوائي
signal_noisy = signal_clean + noise

# تطبيق المرشح
signal_filtered = fir_filter(signal_noisy, coefficients)

print(f"القراءة الخام (عيّنة 50): {signal_noisy[50]:.2f}°C")
print(f"بعد الترشيح: {signal_filtered[50]:.2f}°C")
print(f"القيمة الحقيقية: {signal_clean[50]:.2f}°C")

مرشح IIR: استجابة نبضية لانهائية

IIR (Infinite Impulse Response) يعتمد على عيّنات المدخل والمخرج السابقة:

y[n] = b0*x[n] + b1*x[n-1] - a1*y[n-1] - a2*y[n-2]

مميزاته: أقل معاملات لنفس الأداء — مثالي للأنظمة المحدودة الموارد.

عيوبه: يمكن أن يصبح غير مستقر إذا لم يُصمَّم بعناية.

def iir_lowpass(x, alpha=0.1):
    """مرشح IIR تمرير منخفض من الرتبة الأولى
    alpha: معامل التنعيم (0 < alpha < 1)
    alpha صغير = تنعيم أقوى لكن استجابة أبطأ
    """
    y = np.zeros(len(x))
    y[0] = x[0]
    for n in range(1, len(x)):
        y[n] = alpha * x[n] + (1 - alpha) * y[n-1]
    return y

# مقارنة قيم مختلفة لـ alpha
for alpha in [0.05, 0.1, 0.3]:
    filtered = iir_lowpass(signal_noisy, alpha)
    error = np.mean(np.abs(filtered[10:] - signal_clean[10:]))
    print(f"alpha={alpha:.2f}: متوسط الخطأ = {error:.3f}°C")

الخرج النموذجي:

alpha=0.05: متوسط الخطأ = 1.102°C
alpha=0.10: متوسط الخطأ = 0.873°C
alpha=0.30: متوسط الخطأ = 1.241°C

أفضل alpha يعتمد على طبيعة الإشارة والضجيج — تجريب عملي ضروري.

النوافذ (Windowing): تحسين التحليل الطيفي

عند تحليل إشارة باستخدام تحويل فورييه السريع (FFT)، نقطّع الإشارة إلى أجزاء محدودة. هذا التقطيع يسبب تسرّب طيفي (Spectral Leakage) — تشوّه في الطيف.

الحل: ضرب الإشارة بـدالة نافذة (Window Function) قبل FFT:

النافذة الخصائص الاستخدام
مستطيلة (Rectangular) أعلى دقة ترددية، أسوأ تسرّب نادراً
هانينغ (Hanning) توازن جيد تحليل عام
هامينغ (Hamming) تسرّب جانبي أقل تحليل الاهتزاز
بلاكمان (Blackman) أقل تسرّب فصل ترددات قريبة
import numpy as np

N = 256  # عدد العيّنات
n = np.arange(N)

# إشارة اختبار: ترددان قريبان
fs = 1000
f1, f2 = 100, 110  # فرق 10 Hz فقط
signal = np.sin(2*np.pi*f1/fs*n) + 0.5*np.sin(2*np.pi*f2/fs*n)

# بدون نافذة (مستطيلة)
fft_rect = np.abs(np.fft.fft(signal))[:N//2]

# مع نافذة هامينغ
window = np.hamming(N)
fft_hamming = np.abs(np.fft.fft(signal * window))[:N//2]

freqs = np.fft.fftfreq(N, 1/fs)[:N//2]

# مقارنة القمم
peak_rect = freqs[np.argsort(fft_rect)[-2:]]
peak_hamming = freqs[np.argsort(fft_hamming)[-2:]]

print(f"القمم بدون نافذة: {sorted(peak_rect)} Hz")
print(f"القمم مع هامينغ: {sorted(peak_hamming)} Hz")
print(f"الترددات الحقيقية: [{f1}, {f2}] Hz")

تطبيق صناعي: كشف عيوب المحامل بتحليل الاهتزاز

في مصنع، حساس اهتزاز على محرك يقيس إشارة معقدة. باستخدام أدوات DSP يمكننا كشف عيوب المحامل الكروية مبكراً:

import numpy as np

# محاكاة إشارة اهتزاز من محمل كروي
np.random.seed(42)
fs = 10000  # تردد العيّنات 10 kHz
t = np.arange(0, 1, 1/fs)  # ثانية واحدة

# إشارة الاهتزاز الطبيعي (50 Hz من دوران المحرك)
vibration = 2.0 * np.sin(2*np.pi*50*t)

# إضافة تردد عيب المحمل الخارجي (BPFO = 162 Hz)
# هذا التردد يدل على بداية تلف في الحلقة الخارجية
fault_signal = 0.3 * np.sin(2*np.pi*162*t)
vibration += fault_signal

# ضجيج
vibration += np.random.normal(0, 0.5, len(t))

# تحليل FFT مع نافذة هامينغ
N = len(vibration)
window = np.hamming(N)
fft_result = np.abs(np.fft.fft(vibration * window))[:N//2]
freqs = np.fft.fftfreq(N, 1/fs)[:N//2]

# البحث عن القمم
threshold = np.mean(fft_result) + 3 * np.std(fft_result)
peaks_idx = np.where(fft_result > threshold)[0]
peak_freqs = freqs[peaks_idx]

print("الترددات المكتشفة (فوق العتبة):")
for f in sorted(set(np.round(peak_freqs, 0))):
    if f > 0:
        print(f"  {f:.0f} Hz", end="")
        if abs(f - 50) < 5:
            print(" (دوران المحرك - طبيعي)")
        elif abs(f - 162) < 5:
            print(" (BPFO - تحذير: عيب في المحمل!)")
        else:
            print()

# مؤشر الخطورة
rms_total = np.sqrt(np.mean(vibration**2))
print(f"\nقيمة RMS الكلية: {rms_total:.3f} mm/s")
if rms_total < 2.8:
    print("الحالة: جيدة")
elif rms_total < 7.1:
    print("الحالة: مقبولة - مراقبة مطلوبة")
else:
    print("الحالة: خطرة - صيانة فورية!")

ملخص ومقارنة

الموضوع النقطة الأساسية تطبيق صناعي
نظرية نايكويست fs ≥ 2 * fmax تحديد سرعة ADC
الطيّ الترددي خطأ لا يمكن إصلاحه بعد الحدوث مرشح مضاد للطي
مرشح FIR مستقر دائماً، طور خطي تنعيم قراءات الحساسات
مرشح IIR كفاءة عالية، حذر من الاستقرار ترشيح فوري في PLC
النوافذ تقليل التسرّب الطيفي تحليل FFT دقيق
تحويل Z جبر المرشحات الرقمية تصميم وتحليل المرشحات

نصيحة عملية: في بيئة المصنع، ابدأ دائماً بمرشح متوسط متحرك (FIR) البسيط. إذا لم يكفِ، انتقل لمرشح IIR من الرتبة الأولى (Exponential Moving Average). لا تعقّد الأمور إلا إذا اقتضت الضرورة — أبسط مرشح يؤدي المطلوب هو الأفضل.

signal-processing digital-filter Z-transform sampling noise aliasing معالجة الإشارات المرشح الرقمي تحويل Z معدل العينات الضوضاء التراكب الطيفي