主頁 > 軟體設計 > ??手把手教你Python+matplotlib模擬鎖相放大器的原理以及作業程序??《??記得收藏??》

??手把手教你Python+matplotlib模擬鎖相放大器的原理以及作業程序??《??記得收藏??》

2021-09-25 18:02:20 軟體設計

??手把手教你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=CA2dt`代替,因為信號和噪聲的積分時間是相同的,而信號的波形是采樣得到的,所以 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列印可編輯文本

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more