1. 程式人生 > >Python在訊號與系統中的應用(1)——Hilbert變換,Hilbert在單邊帶包絡檢波的應用,FIR_LPF濾波器設計,還有逼格高高的FM(PM)調製

Python在訊號與系統中的應用(1)——Hilbert變換,Hilbert在單邊帶包絡檢波的應用,FIR_LPF濾波器設計,還有逼格高高的FM(PM)調製

多謝董老師,董老師是個好老師!

心情久久不能平靜,主要是高頻這門課的分析方法實在是讓我難以理解,公式也背不過,還是放放吧。

最近厭惡了Matlab臃腫的體積和頻繁的讀寫對我的Mac的損害,所以學習了一下Python這一輕量級的指令碼,發現“Python自誕生那天就跟科學計算分不開”這個事實。無聊,寫寫心得。

配置環境什麼的還是弄了幾個晚上的。在Mac下用PyCharm還是很好滴,裝上NumPy,SciPy等等一眾免費的,很不錯的Python包,就可以灰了!

1.Hilbert變換及其在單邊帶(SSB)包絡檢波的應用

定義神馬的,性質神馬的自己百度去。我也懶得寫公式了,大家將就著看。

先定義個東西,H(t)為Hilbert變換後的時域

訊號,f(t)為原始時域訊號。那麼其包絡為:

Envelop = sqrt(H^2(t)+f^2(t))。

好了,寫程式碼什麼的都簡單了。

import numpy as np
	import pylab as pl
	import scipy.signal as signal

	from scipy import fftpack

	t = np.arange(0, 0.3, 1/20000.0)
	x = np.sin(2*np.pi*1000*t) * (np.sin(2*np.pi*20*t) + np.sin(2*np.pi*8*t) + 3.0)
	hx = fftpack.hilbert(x)
	pl.subplot(221)
	pl.plot(x, label=u"Carrier")
	pl.plot(np.sqrt(x**2 + hx**2), "r", linewidth=2, label=u"Envelop")
	pl.title(u"Hilbert Transform")
	pl.legend()

然後是它的結果,看,是不是逼格高高的不可一世!~~


2.FIR_LPF設計

用Python這種動態語言寫幾百個引數的有限衝激響應數字低通濾波器(Finite Impulse Response-Low Pass Digital Filter),實在是太難為人家了,還是用內建的函式或者內嵌C吧。看那一長串,我還想再打一遍,有限衝激響應數字低通濾波器,逼格高高的!!

下面是程式碼,FIR濾波器在這裡我估計引數不下100,所以內嵌吧,否則慢死。。

import numpy as np
	import pylab as pl
	import scipy.signal as signal

	from scipy import fftpack

	

	def h_ideal(n, fc):
    	return 2*fc*np.sinc(2*fc*np.arange(-n, n, 1.0))

	b = h_ideal(30, 0.25)
	b2 = signal.firwin(len(b), 0.6)

	w, h = signal.freqz(b)
	w2, h2 = signal.freqz(b2)

	#pl.figure(figsize=(8,6))
	pl.subplot(222)
	pl.plot(w/2/np.pi, 20*np.log10(np.abs(h)), label=u"h_ideal")
	pl.plot(w2/2/np.pi, 20*np.log10(np.abs(h2)), label=u"firwin")
	pl.xlabel(u"Normalized Frequency Rad/Sample")
	pl.ylabel(u"Magnitude (dB)")
	pl.title(u"FIR Low Pass Filter")
	pl.legend()
	pl.subplot(224)
	pl.plot(b, label=u"h_ideal")
	pl.plot(b2, label=u"firwin")
	pl.legend()
	pl.show()


看這逼格高高的,都不說了。。

3.下面是董老師指導我的,雖然很簡單。。FM調製

董老師說mf的引數調小了,我看果然是。課本不可信,給的引數都mv毫伏級,坑爹!

碼程式碼這種小事就簡單多了

import numpy as np
import pylab as pl
import scipy as sp
from scipy import integrate
from scipy import fftpack

sample_rate = 10000

t = np.arange(0, 1.0, 1.0 / sample_rate)  # generate time sampling

omega_base = 40
omega_carrier = 800

mf = 1
v0 = 5
v_omega = 10

base = np.cos(omega_base * t)

pm = v0 * np.cos(omega_carrier * t + v_omega * base)
pl.plot(base)
pl.plot(pm)
pl.show()

綠的是最後的訊號,藍的是原始訊號。

好了,說完了第一部分,第二部分寫啥還沒有想好,到時再說,嗯。

今天好娘快,晚上繼續學高頻。

董老師是個好人,好人一生平安。。。。。。

最近我怎麼這麼婆媽了。。。!!