通过示波器数据进行正弦信号参数估计

举报
tsinghuazhuoqing 发表于 2021/12/26 23:44:01 2021/12/26
【摘要】 实验要求 在第一次作业中的第二小题,练习了根据信号的波形写出对应信号的表达式。但在实际中,我们观测到的信号往往是在示波器上的波形,此时该如何获得这些波形的数学表达式? 测量波形的示波器 本质...

实验要求

第一次作业中的第二小题,练习了根据信号的波形写出对应信号的表达式。但在实际中,我们观测到的信号往往是在示波器上的波形,此时该如何获得这些波形的数学表达式?
测量波形的示波器

测量波形的示波器

本质上讲,实际信号中都会带有随机性,是没有确定的数学表达式的。但在某些情况下,我们是预先知道信号的类型的,比如正弦波,但不知道信号的一些参数。例如幅值、频率和相位。如果这些参数知道了,便可以写出对应的信号数学表达式了。在这种情况下,从观测到的带有噪声的信号波形中回复处信号,则属于信号参数估计的内容了。
部分电子元器件

部分电子元器件

在实际应用中,信号的参数往往非常重要。下面举一个例子:如果手边只有一个万用表,但没有能够测量电容、电感的RCL桥,为了想知道一个电容器件的准确容值,可以将待测的电容与一个电阻串联在一起。电阻的阻值可以使用万用表精确测量。使用一个信号源产生一个正弦波信号施加在RC串联电路上,使用示波器同时测量信号源的信号以及RC分压后的信号。

利用RC测量电子器件参数电路

利用RC测量电子器件参数电路

根据电路原理,可以知道上述电路稳态输入输出正弦信号之间的关系如下:

V ˙ = 1 j 2 π f C 1 R 1 + 1 j 2 π f C 1 U ˙ = 1 1 + j 2 π f R 1 C 1 U ˙ \dot V = {{{1 \over {j2\pi fC_1 }}} \over {R_1 + {1 \over {j2\pi fC_1 }}}}\dot U = {1 \over {1 + j2\pi fR_1 C_1 }}\dot U V˙=R1+j2πfC11j2πfC11U˙=1+j2πfR1C11U˙

实测测量电路和示波器

实测测量电路和示波器

因此,输入输出正弦信号的幅度之比为:
α = ∣ V ˙ ∣ ∣ U ˙ ∣ = 1 1 + ( 2 π f R C ) 2 \alpha = {{\left| {\dot V} \right|} \over {\left| {\dot U} \right|}} = {1 \over {\sqrt {1 + \left( {2\pi fRC} \right)^2 } }} α=U˙V˙=1+(2πfRC)2 1

输入输出正弦信号的相位差为: θ \theta θ tan ⁡ ( θ ) = 2 π f ⋅ R C \tan \left( \theta \right) = 2\pi f \cdot RC tan(θ)=2πfRC

所以,只要能够测量出U,V两个正弦信号的幅度或者相位,频率,再加上已知电阻阻值R\1.,便可以计算出来待测电容的容值。
C = tan ⁡ θ 2 π f ⋅ R = 1 − α 2 α ⋅ 1 2 π f ⋅ R C = {{\tan \theta } \over {2\pi f \cdot R}} = {{\sqrt {1 - \alpha ^2 } } \over \alpha } \cdot {1 \over {2\pi f \cdot R}} C=2πfRtanθ=α1α2 2πfR1

已知上面的串联电路中的电阻\nR\1.=1009欧姆。示波器显示波形的数值可以通过已经存储在CH12.MAT中,数值的采样时间间隔fs=10微妙。

示波器采集的数值波形

示波器采集的数值波形

请根据以上分析,求出待测电容\nC\1.的容值是多少。

提示:

  1. 在MATLAB中通过load()命令读取CH12.MAT中的数据;
  2. ch12(:,1) 是V的数据, ch12(:,2)是U的数据。
  3. 使用MATLAB中fit命令来估计数据中的参数。
    f = fit(x,y,‘fourier1’)
  4. 上面fit命令输出 f(x)=a0+a1cos(xw)+b1sin(xw)
    中的a0,a1,b1,w等参数。

 

使用MATLAB计算出现的问题

使用MATLAB计算步骤

  1. 调入数据并绘制波形图
load ch12'
t = linspace(0, 1400*10e-6,1400)'
plot(t,ch12(:,1), t, ch12(:, 2))'

  
 
  • 1
  • 2
  • 3

两个测量数据通道的波形图

两个测量数据通道的波形图

(2)使用MATLAB 计算正弦波形参数

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

  
 
  • 1
  • 2
  • 3
  • 4

2. 使用MATLAB计算出现的问题

使用上述参数利用两个公式计算,会出现1.5倍的差异。 tan ⁡ ( θ ) = 1.677 ,      1 − α 2 α = 2.6480 \tan \left( \theta \right) = 1.677,\,\,\,\,{{\sqrt {1 - \alpha ^2 } } \over \alpha } = 2.6480 tan(θ)=1.677,α1α2 =2.6480

相关的矢量方差如下图所示:
MATLAB计算出的参数的问题

MATLAB计算出的参数的问题

从MATLAB通过剪切板得到数据

首先在MATLAB命令窗口使用如下命令将CH12数据拷贝到WINDOWS剪切板。

cc(ch12)

  
 
  • 1

然后通过下面的PYTHON程序将剪切板上的数据转换成两个数组,分别对应的输出和输入信号的采集的数据。

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()


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

进行函数拟合和参数计算

两个通道正弦波及其FIT曲线

两个通道正弦波及其FIT曲线

程序代码如下:

#!/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 ]
    aStart[0] = max( yData )
    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
#============================================================


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77

根据上面的PYTHON程序重新计算输入和输出相应的数据对应的正弦参数,数据如下,所得到的估计参数与MATLAB相同。

输出波形拟合正弦参数:
[ 3.95138209e+02  4.67232082e-01  1.07395207e-01 -5.89407332e-02]

输入波形数据拟合正弦参数:
[3.95096587e+02 5.88518451e-01 3.03988482e-01 9.74184940e-01]
tan(theta)=1.6770990200351208
sqrt(1-a**2)/a=2.6480303891707053


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

文章来源: zhuoqing.blog.csdn.net,作者:卓晴,版权归原作者所有,如需转载,请联系作者。

原文链接:zhuoqing.blog.csdn.net/article/details/104565890

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。