python示波器 波形数据_通过示波器数据进行正弦信号参数估计
實(shí)驗(yàn)要求
在第一次作業(yè)中的第二小題,練習(xí)了根據(jù)信號(hào)的波形寫出對(duì)應(yīng)信號(hào)的表達(dá)式。但在實(shí)際中,我們觀測(cè)到的信號(hào)往往是在示波器上的波形,此時(shí)該如何獲得這些波形的數(shù)學(xué)表達(dá)式?
本質(zhì)上講,實(shí)際信號(hào)中都會(huì)帶有隨機(jī)性,是沒(méi)有確定的數(shù)學(xué)表達(dá)式的。但在某些情況下,我們是預(yù)先知道信號(hào)的類型的,比如正弦波,但不知道信號(hào)的一些參數(shù)。例如幅值、頻率和相位。如果這些參數(shù)知道了,便可以寫出對(duì)應(yīng)的信號(hào)數(shù)學(xué)表達(dá)式了。在這種情況下,從觀測(cè)到的帶有噪聲的信號(hào)波形中回復(fù)處信號(hào),則屬于信號(hào)參數(shù)估計(jì)的內(nèi)容了。
在實(shí)際應(yīng)用中,信號(hào)的參數(shù)往往非常重要。下面舉一個(gè)例子:如果手邊只有一個(gè)萬(wàn)用表,但沒(méi)有能夠測(cè)量電容、電感的RCL橋,為了想知道一個(gè)電容器件的準(zhǔn)確容值,可以將待測(cè)的電容與一個(gè)電阻串聯(lián)在一起。電阻的阻值可以使用萬(wàn)用表精確測(cè)量。使用一個(gè)信號(hào)源產(chǎn)生一個(gè)正弦波信號(hào)施加在RC串聯(lián)電路上,使用示波器同時(shí)測(cè)量信號(hào)源的信號(hào)以及RC分壓后的信號(hào)。
根據(jù)電路原理,可以知道上述電路穩(wěn)態(tài)輸入輸出正弦信號(hào)之間的關(guān)系如下:
因此,輸入輸出正弦信號(hào)的幅度之比為:
輸入輸出正弦信號(hào)的相位差為:
所以,只要能夠測(cè)量出U,V兩個(gè)正弦信號(hào)的幅度或者相位,頻率,再加上已知電阻阻值R\1.,便可以計(jì)算出來(lái)待測(cè)電容的容值。
已知上面的串聯(lián)電路中的電阻\nR\1.=1009歐姆。示波器顯示波形的數(shù)值可以通過(guò)已經(jīng)存儲(chǔ)在CH12.MAT中,數(shù)值的采樣時(shí)間間隔fs=10微妙。
請(qǐng)根據(jù)以上分析,求出待測(cè)電容\nC\1.的容值是多少。
提示:在MATLAB中通過(guò)load()命令讀取CH12.MAT中的數(shù)據(jù);
ch12(:,1) 是V的數(shù)據(jù), ch12(:,2)是U的數(shù)據(jù)。
使用MATLAB中fit命令來(lái)估計(jì)數(shù)據(jù)中的參數(shù)。 f = fit(x,y,'fourier1')
上面fit命令輸出 f(x)=a0+a1cos(xw)+b1sin(xw) 中的a0,a1,b1,w等參數(shù)。
使用MATLAB計(jì)算出現(xiàn)的問(wèn)題
使用MATLAB計(jì)算步驟調(diào)入數(shù)據(jù)并繪制波形圖
load ch12'
t = linspace(0, 1400*10e-6,1400)'
plot(t,ch12(:,1), t, ch12(:, 2))'
(2)使用MATLAB 計(jì)算正弦波形參數(shù)
f1 = fit(t, ch12(:,1), 'fourier1')'
f2 = fit(t, ch12(:,2), 'fourier1')
f1: a0:119.1442, a1:-1.6132, b1:27.3382, omiga:2481
f2: a0:150.0722, a1:64.1255, b1:43.5524, omiga:2481
2. 使用MATLAB計(jì)算出現(xiàn)的問(wèn)題
使用上述參數(shù)利用兩個(gè)公式計(jì)算,會(huì)出現(xiàn)1.5倍的差異。
相關(guān)的矢量方差如下圖所示:
從MATLAB通過(guò)剪切板得到數(shù)據(jù)
首先在MATLAB命令窗口使用如下命令將CH12數(shù)據(jù)拷貝到WINDOWS剪切板。
cc(ch12)
然后通過(guò)下面的PYTHON程序?qū)⒓羟邪迳系臄?shù)據(jù)轉(zhuǎn)換成兩個(gè)數(shù)組,分別對(duì)應(yīng)的輸出和輸入信號(hào)的采集的數(shù)據(jù)。
pastestr = clipboard.paste().strip('[').strip(']').split(';')
data1=[]
data2=[]
for s in pastestr:
ss = s.split(' ')
data1.append(int(ss[0]))
data2.append(int(ss[1]))
plt.plot(data1)
plt.plot(data2)
tspsave('CH12', ch1=data1, ch2=data2)
printf('\a')
plt.show()
進(jìn)行函數(shù)擬合和參數(shù)計(jì)算
程序代碼如下:
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TEST2.PY -- by Dr. ZhuoQing 2020-02-28
#
# Note:
#============================================================
from headm import *
from scipy.optimize import leastsq
ch1, ch2 = tspload('CH12', 'ch1', 'ch2')
#------------------------------------------------------------
def make_sine_graph( params, xData):
"""
take amplitudes A and phases P in form [ C, A0, A1, A2, ..., An, P0, P1,..., Pn ]
and construct function f = C +A0 sin( w t + P0) + A1 sin( 2 w t + Pn ) + ... + An sin( n w t + Pn )
and return f( x )
"""
fr = params[0]
C = params[1]
npara = params[2:]
lp =len( npara )
amps = npara[ : lp // 2 ]
phases = npara[ lp // 2 : ]
fact = range(1, lp // 2 + 1 )
return [ sum( [ a * sin( 2 * pi * x * f * fr + p ) for a, p, f in zip( amps, phases, fact ) ]) + C for x in xData ]
def sine_residuals( params , xData, yData):
yTh = make_sine_graph( params, xData )
diff = [ y - yt for y, yt in zip( yData, yTh ) ]
return diff
def sine_fit_graph( xData, yData, freqGuess=100., dcGuess=100,sineorder = 3 ):
aStart = sineorder * [ 0 ]
aStart0[]( yData "0")
pStart = sineorder * [ 0 ]
result, _ = leastsq( sine_residuals, [ freqGuess, dcGuess ] + aStart + pStart, args=( xData, yData ) )
return result
#------------------------------------------------------------
if __name__ == '__main__':
ch1 = [c / 255 for c in ch1]
ch2 = [c / 255 for c in ch2]
t = linspace(0, 1400*10e-6, 1400, endpoint=False)
result1 = sine_fit_graph(t, ch1, freqGuess=2481/2/pi, dcGuess=0.5, sineorder=1)
result2 = sine_fit_graph(t, ch2, freqGuess=2481/2/pi, dcGuess=0.5, sineorder=1)
printf(result1, result2)
plt.plot(t, make_sine_graph(result1, t))
plt.plot(t, ch1)
plt.plot(t, make_sine_graph(result2, t))
plt.plot(t, ch2)
tspsave('fitresult', result1=result1, result2=result2)
printf(tan(result2[3] - result1[3]))$$C = {{\tan \theta } \over {2\pi f \cdot R}} = {{\sqrt {1 - \alpha ^2 } } \over \alpha } \cdot {1 \over {2\pi f \cdot R}}$$
alpha = result1[2] / result2[2]
printf(sqrt(1-alpha**2)/alpha)
plt.show()
#------------------------------------------------------------
# END OF FILE : TEST2.PY
#============================================================
根據(jù)上面的PYTHON程序重新計(jì)算輸入和輸出相應(yīng)的數(shù)據(jù)對(duì)應(yīng)的正弦參數(shù),數(shù)據(jù)如下,所得到的估計(jì)參數(shù)與MATLAB相同。
輸出波形擬合正弦參數(shù):
[ 3.95138209e+02 4.67232082e-01 1.07395207e-01 -5.89407332e-02]
輸入波形數(shù)據(jù)擬合正弦參數(shù):
[3.95096587e+02 5.88518451e-01 3.03988482e-01 9.74184940e-01]
tan(theta)=1.6770990200351208
sqrt(1-a**2)/a=2.6480303891707053
總結(jié)
以上是生活随笔為你收集整理的python示波器 波形数据_通过示波器数据进行正弦信号参数估计的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Unity中AssetBundle打包文
- 下一篇: 64位W7系统安装内存8G,但是系统只显