??手把手教你Python+matplotlib模擬鎖相放大器的原理以及作業程序??《??記得收藏??》
- 目錄
-
🏳??🌈開講啦!!!!🏳??🌈蘇州程式大白🏳??🌈 - 🌟博主介紹
- 前言
- python實作模擬鎖相放大器
- matplotlib繪圖
- 繪畫正弦波
- 繪畫方波
- 繪畫頻域分析
- 繪畫高斯白噪聲
- 模擬鎖相放大器的作業程序
- 🌟8、作者相關的文章、資源分享🌟
- 🏳??🌈關注蘇州程式大白,持續更新技術分享,謝謝大家支持🏳??🌈
目錄
| 🏳??🌈開講啦!!!!🏳??🌈蘇州程式大白🏳??🌈 |

🌟博主介紹
💂 個人主頁:蘇州程式大白
🤟作者介紹:中國DBA聯盟(ACDU)成員,CSDN全國各地程式猿(媛)聚集地管理員,目前從事工業自動化軟體開發作業,擅長C#、Java、機器視覺、底層演算法等語言,2019年成立柒月軟體作業室,
💬如果文章對你有幫助,歡迎關注、點贊、收藏(一鍵三連)和C#、Halcon、python+opencv、各大公司面試等一些訂閱專欄哦
💅 有任何問題歡迎私信,看到會及時回復
👤 微信號:stbsl6,微信公眾號:蘇州程式大白
🎯 想加入技術交流群的可以加我好友,群里會分享學習資料
前言
我們先講講鎖相放大器的基本結構示于下方圖 ,包括信號通道、參考通道、相敏檢測器 PSD 和低通濾波器 LPF 等, 各個模塊的基本功能描述如下:

-
1、信號通道: 對信號輸入進行放大及濾波, 將微弱信號放大到足以推動相敏檢測器作業的電平, 并且要濾除部分干擾和噪聲,
-
2、參考輸入: 一般是等幅正弦或者方波信號, 它可以是從外部輸入的某種周期信號,也可以是系統內原先用于調制的載波信號或用于斬波的信號,
-
3、參考通道: 對參考輸入進行放大或衰減, 以適應相敏檢測器對幅度的要求,參考通道的另一個重要功能是對參考輸入進行相位鎖定及移相等處理,從而產生同頻正弦波與余弦波,以提供給相敏檢波器進行乘法運算,相敏檢波器(PSD): 以參考通道提供的基準正弦與余弦分量作為輸入, 對經過信號通道放大濾波的 進行相敏檢波(乘法運算), 從而實作檢波,
-
4、 如下方圖所示頻譜遷移程序,將 的頻譜由 處遷移到 處,再經 LPF 濾除噪聲, 其輸出 對 的幅度和相位都敏感,這樣就達到了既鑒幅又鑒相(相位及幅度的測量)的目的,

-
5、低通濾波器(LPF): 頻帶可以做得很窄, 所以可使鎖相放大器達到較大的 SNIR, 鎖相放大器的應用大致分為以下領域:測量噪聲中的微弱信號:
-
紅外分光光度計,2次量子光分光分析,光聲光譜儀,超導材料的評價,金屬材料的張力試驗,放大器的CMRR或IMRR測量,
-
測量被測定體傳輸函式的微小變化:俄歇電子能譜,金屬探測器,渦流探傷器,被測定體的矢量分析:RLC測量儀,電解-阻抗,電子束測量,
python實作模擬鎖相放大器
首先引入需要用到的package,使用%matplotlib widget可以產生互動式的圖片,
import numpy as np
from scipy.fftpack import fft
from scipy import signal as sg
from matplotlib import pyplot as plt
%matplotlib widget
matplotlib繪圖
在本文中將會產生許多的圖片,為了方便繪圖撰寫一個展示信號的繪圖函式,
def draw(x, y, title='', xlable='time(s)', ylable='amplitude', L=-3.8, H=3.8):
'''
draw
Parameters
----------
x : numpy array
abscissa
y : numpy array
ordinate
Returns
-------
'''
# canvas settings
plt.close()
if L!=H:
plt.ylim(L, H)
plt.title(title)
plt.xlabel(xlable)
plt.ylabel(ylable)
plt.plot(x, y)
plt.show()
繪畫正弦波
采用正弦波作為輸入信號,另外,參考信號、噪聲信號等都需要用到正弦信號,所以第一步將撰寫一個產生給定幅度、頻率和相位的正弦信號的函式,
def g_sin(t=1, amp=1, f0=10, fs=500, phi=0):
'''
generate sinusoid
Parameters
----------
t : float
time length of the generated sequence
amp : float
amplitude
f0 : float
frequency of sinusoid in Hz
fs : float
sampling rate per second
phi : float
initial phase in deg
Returns
-------
anonymous : list[numpy array, numpy array]
[abscissa, a sinusoid signal]
'''
T = 1/fs
N = t/T
x = 2*np.pi*np.arange(N)*T
return [np.arange(0, t, T), amp*np.sin(f0*x+phi*np.pi/180)]
x, y = g_sin()
draw(x, y)

繪畫方波
參考信號可以使用正弦波、方波等,在本實驗中將使用方波,而方波的傅里葉級數為:
??
所以我們可以利用上面的正弦波函式,產生一個近似的方波,方波的階數(即K)越大近似效果越好,K=50時就有很好的效果, (PS:此處方波均指占空比為50%,正負對稱的方波)
def g_square_wave(t=1, amp=1, f0=10, fs=500, K=50):
'''
generate square wave
Parameters
----------
t : float
time length of the generated sequence
amp : float
amplitude
f0 : float
frequency of sinusoid in Hz
fs : float
sampling rate per second
K : int
order of fourier series
Returns
-------
anonymous : list[numpy array, numpy array]
[abscissa, a square wave]
'''
T = 1/fs
N = t/T
x = 2*np.pi*np.arange(N)*T
y = np.zeros(len(x))
k = 2*np.arange(1, K)-1
for i in range(len(x)):
y[i] = amp*np.sum(np.sin(k*f0*x[i])/k)
return [np.arange(0, t, T), 4*y/np.pi]
x, y = g_square_wave()
draw(x, y)

使用上述兩個函式,可以疊加產生帶有噪聲的信號,
x, y1 = g_sin(amp=0.2, f0=30)
x, y2 = g_sin(amp=0.35, f0=3, phi=45)
x, y3 = g_square_wave(amp=0.1, f0=10)
draw(x, y1+y2+y3)

繪畫頻域分析
這些噪聲在時域中難以分辨,不過信號與噪聲不同,往往具有明顯的頻率特征,而噪聲一般是與頻率無關的,或者是在特定頻率范圍內的,所以在頻域內可以很好的分辨出輸入信號的各種成分,
使用快速傅里葉變換(FFT)從時域轉化到頻域,并且對振幅譜進行取半歸一化,
def FFT(s, fs):
'''
fast fourier transform
Parameters
----------
s : numpy array
signal
fs : float
sampling rate per second
Returns
-------
'''
X = fft(s)
mX = np.abs(X) # magnitude
pX = np.angle(X) # phase
draw(np.arange(int(fs/2)), mX[range(int(fs/2))]/fs,
'Input signal in frequency domain', 'frequency(Hz)', 'amplitude', 0, 0)
FFT(y1+y2+y3, 500)

繪畫高斯白噪聲
上面的信號添加的噪聲還是正弦信號,而現實中比較常見的噪聲是白噪聲,下面的函式可以根據輸入信號產生一個特定信噪比的白噪聲,
信噪比的定義是:

在本實驗中,功率
P
P
P可以用功
‘
W
=
∫
P
d
t
=
C
∫
A
2
d
t
`W=\int Pdt=C\int A^2dt
‘W=∫Pdt=C∫A2dt`代替,因為信號和噪聲的積分時間是相同的,而信號的波形是采樣得到的,所以
W
W
W可以用
∑
x
i
2
\sum x_i^2
∑xi2?代替,于是有: ?
?
def wgn(x, snr):
'''
generate Gauss white noise
Parameters
----------
x : numpy array
signal
snr : float
signal-to-noise ratio
Returns
-------
anonymous : numpy array
Gauss white noise
'''
snr = 10**(snr/10.0)
xpower = np.sum(x**2)/len(x)
npower = xpower / snr
return np.random.randn(len(x)) * np.sqrt(npower)
noise = wgn(np.sin(np.arange(0, 1000000)*0.1), 6)
plt.close()
plt.subplot(211)
plt.hist(noise, bins=100)
plt.subplot(212)
plt.psd(noise)
plt.show()

模擬鎖相放大器的作業程序
下面開始正式的模擬程序:
獲得輸入信號,輸入信號由10Hz的目標信號和其他頻率的正弦噪聲以及白噪聲組成
A、 增加正弦部分
x, y1 = g_sin(amp=0.1)
x, y2 = g_sin(amp=0.5, f0=50)
x, y3 = g_sin(amp=0.8, f0=3)
x, y4 = g_sin(amp=0.3, f0=200)
signal = y1+y2+y3+y4
B、增加白噪聲部分
noise = wgn(signal, 10)
sn = signal+noise
draw(x, sn)

C、 查看輸入信號的頻域資訊
FFT(sn, 500)

獲得參考信號,方波頻率與目標信號相同,為10Hz
x, y = g_square_wave(K=100)
square = y
draw(x, square)

3、前置放大×2倍
sn = sn*2
draw(x, sn)

4、輸入信號進行帶通濾波,除去/抑制部分噪聲,增強鎖相放大器的性能(動態儲備和輸出動態范圍)
b, a = sg.butter(1, [0.02, 0.12], 'bandpass') # 5Hz - 30Hz
snq = sg.filtfilt(b, a, sn)
draw(x, snq)

5、調諧放大輸入信號×5,增大信噪比
b, a = sg.butter(1, [0.038, 0.042], 'bandpass') # 9.5Hz - 10.5Hz
sns = sg.filtfilt(b, a, snq)
snq = sns*4+snq
draw(x, snq)

6、PSD(相敏檢波器)處理輸入與參考信號(本質為乘法器)
snqx = snq*square
draw(x, snqx)

FFT(snqx, 500)

7、低通濾波,減少其他信號對直流分量的影響(等效噪聲寬度很小)
b, a = sg.butter(3, 0.00004, 'lowpass') # 0 - 0.01Hz
sns = sg.filtfilt(b, a, snqx)
draw(x, sns)

8、直流放大×5
sns = sns*5
draw(x, sns)

🌟8、作者相關的文章、資源分享🌟
🌟讓天下沒有學不會的技術🌟
學習C#不再是難問題
🌳《C#入門到高級教程》🌳
有關C#實戰專案
👉C#RS232C通訊原始碼👈
👉C#委托資料傳輸👈
👉C# Modbus TCP 源代碼👈
👉C# 倉庫管理系統原始碼👈
👉C# 歐姆龍通訊Demo👈
👉C# 歐姆龍通訊Demo👈
👉2021C#與Halcon視覺通用的框架👈
?有關C#專案歡迎各位查看個人主頁?
🌟機器視覺、深度學習🌟
🌌《Halcon入門到精通》🌌
🌌《深度學習資料與教程》🌌
有關機器視覺、深度學習實戰
👉2021年C#+HALCON視覺軟體👈
👉2021年C#+HALCON實作模板匹配👈
👉C#集成Halcon的深度學習軟體👈
👉C#集成Halcon的深度學習軟體,帶[MNIST例子]資料集👈
👉C#支持等比例縮放拖動的halcon WPF開源表單控制元件👈
👉2021年Labview聯合HALCON👈
👉2021年Labview聯合Visionpro👈
👉基于Halcon及VS的動車組制動閘片厚度自動識別模塊👈
?有關機器視覺、深度學習實戰歡迎各位查看個人主頁?
🌟Java、資料庫教程與專案🌟
🍏《JAVA入門到高級教程》🍏
🍏《資料庫入門到高級教程》🍏
有關Java、資料庫專案實戰
👉Java經典懷舊小霸王網頁游戲機原始碼增強版👈
👉Java物業管理系統+小程式原始碼👈
👉JAVA酒店客房預定管理系統的設計與實作SQLserver👈
👉JAVA圖書管理系統的研究與開發MYSQL👈
?有關Java、資料庫教程與專案實戰歡迎各位查看個人主頁?
🌟分享Python知識講解、分享🌟
🥝《Python知識、專案專欄》🥝
🥝《Python 檢測抖音關注賬號是否封號程》🥝
🥝《手把手教你Python+Qt5安裝與使用》🥝
🥝《用一萬字給小白全面講解python編程基礎問答》🥝
🥝《Python 繪制Android CPU和記憶體增長曲線》🥝
有關Python專案實戰
👉Python基于Django圖書管理系統👈
👉Python管理系統👈
👉2021年9個常用的python爬蟲原始碼👈
👉python二維碼生成器👈
?有關Python教程與專案實戰歡迎各位查看個人主頁?
🌟分享各大公司面試題、面試流程🌟
🍏《2021年金九銀十最新的VUE面試題??《??記得收藏??》》🍏
🍏《只要你認真看完一萬字??Linux作業系統基礎知識??分分鐘鐘都吊打面試官《??記得收藏??》》🍏
🍏《??用一萬字給小白全面講解python編程基礎問答??《😀記得收藏不然看著看著就不見了😀》》🍏
?有關各大公司面試題、面試流程歡迎各位查看個人主頁?

🏳??🌈關注蘇州程式大白,持續更新技術分享,謝謝大家支持🏳??🌈

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/302833.html
標籤:其他
上一篇:思路十分清晰的帶大家入門:通訊錄-----圖書管理系統---學生資訊管理系統等小專案的實作,還等什么呢?快來學習吧!
下一篇:vue列印可編輯文本
