درک مفهوم سیگنال تحلیلی و تبدیل هیلبرت

 

تمرکز اصلی این مقاله بر روی فهم رابطه بین سیگنال تحلیلی، تبدیل هیلبرت (Hilbert) و تبدیل فوریه سریع (FFT) است. مثالهایی از کدنویسی در متلب و پایتون نیز در آن لحاظ شده است.

 

 

مقدمه

 

تبدیل فوریه یک سیگنال با مقادیر حقیقی، به صورت مختلط متقارن است. از این موضوع میتوان چنین برداشت کرد که محتوای فرکانسی در فرکانسهای منفی نسبت به محتوا در فرکانسهای مثبت، اضافی است زیرا طیف فرکانسی به صورت متقارن توزیع میشود. گابور (Gabor) و وایل (Ville) در مقاله پیشنهادی‌شان، به دنبال ایجاد سیگنال تحلیلی با حذف این محتوای فرکانسی اضافی (در فرکانسهای منفی) از نتیجه تبدیل فوریه بودند. سیگنال تحلیلی، یک سیگنال با مقادیر مختلط است ولی طیف فرکانسی آن یک طرفه است (تنها برای فرکانسهای مثبت مقدار دارد) و به این ترتیب، محتوای طیفی سیگنال حقیقی اولیه را حفظ میکند. استفاده از سیگنال تحلیلی به جای سیگنال حقیقی واقعی، در بسیاری از کاربردهای پردازش سیگنال مفید واقع شده است. برای مثال، در تحلیل طیفی، استفاده از سیگنال تحلیلی به جای سیگنال حقیقی اصلی، بایاس تخمین را بهبود بخشیده و مصنوعات (نویز) بین نمونه‌ای را که ناشی از اجزاء فرکانسی مثبت و منفی است، حذف میکند.

 

 

سیگنال تحلیلی زمان-پیوسته

 

اگر x(t) یک سیگنال انرژی با مقادیر حقیقی و با پهنای باند نامحدود باشد، z(t) سیگنال تحلیلی متناظر است که میخواهیم آن را بسازیم. تبدیل فوریه زمان-پیوسته x(t) به صورت زیر است:

 

X(f)=\int_{-\infty}^{+\infty}x(t)e^{-j2\pi ft}dt

 

شکل اندازه تبدیل فوریه X(f) در شکل 1a نشان داده شده است. دقت کنید که سیگنال با مقادیر واقعی است و اندازه طیف آن، متقارن نسبت به محور عمودی است و در حوزه فرکانس به سمت بینهایت گسترده میشود.

 

شکل 1- a- طیف سیگنال پیوسته x(t) b- طیف سیگنال تحلیلی z(t)

 

همانطور که در بخش مقدمه بدان اشاره شد، یک سیگنال تحلیلی از طریق حذف محتوای فرکانسی در بخش منفی از تبدیل فوریه یک سیگنال با مقادیر واقعی میتواند تشکیل شود. با توجه به این موضوع، محتوای طیفی Z(f) برای سیگنال تحلیلی z(t) به شکل زیر بدست می‌آید:

 

Z(f)=\left\{\begin{matrix} X(0) & for f=0 \\ 2X(f) & for f>0 \\ 0 & for f>0 \end{matrix}\right.

 

طیف متناظر سیگنال تحلیلی حاصل در شکل 1b نشان داده شده است.

 

از آنجاییکه طیف سیگنال تحلیلی یک طرفه است، سیگنال تحلیلی حوزه زمان به صورت مختلط خواهد بود و به همین دلیل سیگنال تحلیلی بر حسب اجزاء حقیقی و موهومی به شکل z(t)=z_r(t)+jz_i(t) نمایش داده میشود. چون محتوای طیفی در یک سیگنال تحلیلی حفظ میشود، به نظر میرسد که بخش حقیقی سیگنال تحلیلی در حوزه زمان در واقع همان سیگنال با مقادیر واقعی اصلی است (z_r(t)=x(t)). حال چه چیزی جای بخش موهومی را میگیرد؟ بخش همراه x(t) که بخش موهومی سیگنال تحلیلی را اشغال میکند کدام است؟ خلاصه معادلات به شرح زیر است:

 

\\ z(t)=z_r(t)+jz_i(t) \\ z_r(t)=x(t) \space z_i(t) = ??

 

جالب توجه است بدانید که تبدیل هیلبرت برای یافتن تابع همراهی کننده (بخش موهومی در معادله بالا) به یک سیگنال با مقادیر واقعی به طوریکه سیگنال حقیقی به طور تحلیلی قابل توسعه از محور حقیقی به بخش نیمه بالایی صفحه مختلط باشد، قابل استفاده است. اگر تبدیل هیلبرت را به صورت HT\left \{ \right \} نشان دهیم، سیگنال تحلیلی به شکل زیر محاسبه میشود:

 

z(t)=z_r(t)+jz_i(t)=x(t)+jHT\left \{ x(t) \right \}

 

از بحث تا کنون چنین نتیجه میشود که ما میتوانیم یک سیگنال تحلیلی z(t) را برای یک سیگنال حقیقی x(t) از دو طریق بدست آوریم:

     – رویکرد حوزه فرکانس: طیف یکطرفه z(t) از طیف سیگنال با مقدار حقیقی x(t) با اعمال معادله گفته شده در بالا ایجاد میشود.

     – رویکرد حوزه زمان: استفاده از تبدیل هیلبرت که در معادلات بالا اشاره شد.

 

یکی از مهمترین ویژگیهای سیگنال تحلیلی آن است که اجزاء حقیقی و موهومی آن بر هم عمود هستند:

 

\int_{-\infty}^{+\infty}z_i(t)z_r(t)=0

 

 

سیگنال تحلیلی زمان-گسسته

 

از آنجاییکه در عصر دیجیتال قرار داریم، بیشتر به پردازش سیگنال زمان-گسسته علاقمند هستیم. سیگنال زمان-پیوسته با مقادیر واقعی x(t) را فرض کنید که با فواصل زمانی T ثانیه نمونه‌برداری شده است و نمونه‌های زمان-گسسته x[n] حاصل شده است، به عبارت دیگر x[n]=x(nT). طیف سیگنال پیوسته در شکل 2a نشان داده شده است. طیف x[n] که از فرآیند نمونه‌برداری متناوب حاصل میشود، در شکل 2b داده شده است. طیف سیگنال زمان-گسسته x[n] از طریق تبدیل فوریه زمان گسسته (DTFT) قابل محاسبه است:

 

X(f)=T\sum _{n=0}^{N-1}x[n]e^{-j2\pi fnT}

 

 

شکل 2- a- تبدیل فوریه زمان-پیوسته سیگنالx(t) b- طیف x[n] حاصل شده از طریق نمونه‌برداری متناوب c- طیف یکطرفه متناوب سیگنال تحلیلی z(t)

 

در اینجا، میخواهیم یک سیگنال تحلیلی زمان-گسسته از سیگنال نمونه‌برداری شده با مقادیر واقعی x[n] بسازیم. انتظار داریم که سیگنال تحلیلی مقادیر مختلط z(t)=z_r(t)+jz_i(t) داشته باشد و دو ویژگی مطلوب زیر را نیز داشته باشد:

 

  • بخش حقیقی سیگنال تحلیلی باید مشابه سیگنال با مقادیر حقیقی اصلی باشد. z_r[n]=x[n]
  • بخشهای حقیقی و موهومی سیگنال تحلیلی باید ویژگی تعامد زیر را داشته باشند:

\sum_{n=0}^{N-1}z_r[n]z_i[n]=0

 

در رویکرد حوزه فرکانس برای حالت سیگنال زمان-پیوسته، مشاهده کردیم که یک سیگنال تحلیلی از طریق حذف اجزاء فرکانسی منفی از طیف سیگنال حقیقی ساخته میشود. ما نمیتوانیم این کار را با سیگنال نمونه‌برداری شده به صورت متناوب x[n] انجام دهیم. ویژگی طبیعی تقارن آینه‌ای متناوب طیف فرکانسی مانع از حذف اجزاء فرکانسی آن میشود. اگر این کار انجام دهیم، باعث میشود که کل طیف ناپدید شود. یک راه حل برای این مساله، صفر کردن نیمه منفی هر تناوب طیف است. طیف حاصل برای سیگنال تحلیلی در شکل 2c نشان داده شده است.

با داشتن نمونه‌های سیگنال x[n] با طول زوج N، فرآیند ساختن سیگنال تحلیلی z[n] به صورت زیر است. این روش هر دو ویژگی مطلوب گفته شده در بالا را به همراه دارد:

 

  • تبدیل فوریه زمان-گسسته، DTFT، برای سیگنال x[n] توسط تبدیل فوریه سریع، FFT، محاسبه شود.
  • سیگنال تحلیلی یک طرفه متناوب N-نقطه‌ای با تبدیل زیر محاسبه شود:

Z[m]=\left\{\begin{matrix} X[0] & for m=0\\ 2X[m] & for 1\leq m\leq \frac{N}{2}-1\\ X[\frac{N}{2}] & for m=\frac{N}{2}\\ 0 & for \frac{N}{2}+1\leq m\leq N-1 \end{matrix}\right.

 

  • در نهایت، سیگنال تحلیلی با محاسبه تبدیل معکوس DTFT از Z[m] محاسبه شود:

z[n]=\frac{1}{NT}\sum_{m=0}^{N-1}z[m]exp(j2\pi mn/N)

 

 

کد MATLAB

 

فرآیند گفته شده، قابل کدنویسی در محیط برنامه‌نویسی متلب با استفاده از تابع fft است. با داشتن نمونه‌های با مقدار حقیقی از سیگنال x[n] با طول N، سیگنال تحلیلی متناظر z[n] همانطور که در ادامه نشان داده شده است، قابل محاسبه است. دقت کنید که متلب، تابع آماده برای محاسبه سیگنال تحلیلی دارد. این تابع hilbert نام دارد.

 

function z = analytic_signal(x)
   %x is a real-valued record of length N, where N is even %returns the analytic signal z[n]
   x = x(:); %serialize
   N = length(x);
   X = fft(x,N);
   z = ifft([X(1); 2*X(2:N/2); X(N/2+1); zeros(N/2-1,1)],N);
end

برای آزمایش این تابع، ما یک نسخه 5 ثانیه‌ای از سیگنال سینوسی با مقادیر حقیقی میسازیم. سیگنال تحلیلی ساخته شده و اجزاء متعامد آن در شکل 3 رسم میشوند. از نمودار میتوان ملاحظه کرد که بخش حقیقی سیگنال تحلیلی دقیقا مشابه سیگنال اصلی است (که سیگنال سینوسی است) و بخش موهومی سیگنال تحلیلی 90- درجه اختلاف فاز با سیگنال اصلی دارد. دقت کنید که بخش موهومی سیگنال تحلیلی یک تابع کسینوسی با اندازه دامنه تغییر مقیاس داده شده با مقدار 1- است که چیزی جز تبدیل هیلبرت تابع سینوسی نیست.

 

t=0:0.001:0.5-0.001;
x = sin(2*pi*10*t); %real-valued f = 10 Hz
subplot(2,1,1); plot(t,x);%plot the original signal
title('x[n] - original signal'); xlabel('n'); ylabel('x[n]');
z = analytic_signal(x); %construct analytic signal
subplot(2,1,2); plot(t, real(z), 'k'); hold on;
plot(t, imag(z), 'r');
title('Components of Analytic signal'); 
xlabel('n'); ylabel('z_r[n] and z_i[n]');
legend('Real(z[n])','Imag(z[n])');


کد Python

 

کد معادل در محیط پایتون در زیر نوشته شده است (آزمایش شده با نسخه 3.6.0)

import numpy as np
def main():
    t = np.arange(start=0,stop=0.5,step=0.001)
    x = np.sin(2*np.pi*10*t)
    
    import matplotlib.pyplot as plt
    plt.subplot(2,1,1)
    plt.plot(t,x)
    plt.title('x[n] - original signal')
    plt.xlabel('n')
    plt.ylabel('x[n]')
    
    z = analytic_signal(x)
    
    plt.subplot(2,1,2)
    plt.plot(t,z.real,'k',label='Real(z[n])')
    plt.plot(t,z.imag,'r',label='Imag(z[n])')
    plt.title('Components of Analytic signal')
    plt.xlabel('n')
    plt.ylabel('z_r[n] and z_i[n]')
    plt.legend()

def analytic_signal(x):
    from scipy.fftpack import fft,ifft
    N = len(x)
    X = fft(x,N)
    h = np.zeros(N)
    h[0] = 1
    h[1:N//2] = 2*np.ones(N//2-1)
    h[N//2] = 1
    Z = X*h
    z = ifft(Z,N)
    return z

if __name__ == '__main__':
    main()

 

 

شکل 3- اجزاء سیگنال تحلیلی برای تابع سینوسی با مقادیر حقیقی

 

 

تبدیل هیلبرت با استفاده از FFT

 

لازم به ذکر است که تابع hilbert در MATLAB، سیگنال تحلیلی z[n] را بر میگرداند و نه تبدیل هیلبرت سیگنال x[n] را. برای محاسبه تبدیل هیلبرت سیگنال دلخواه، تنها کافی است که بخش موهومی سیگنال تحلیلی را در نظر بگیرید. از آنجاییکه ما تابع خود را برای محاسبه سیگنال تحلیلی نوشته‌ایم، محاسبه تبدیل هیلبرت سیگنال با مقادیر حقیقی شبیه عبارت زیر خواهد بود:

x_hilbert = imag(analytic_signal(x))

 

 

 

 

منبع: https://www.gaussianwaves.com