python示波器 波形数据_通过示波器数据进行正弦信号参数估计
实验要求
在第一次作业中的第二小题,练习了根据信号的波形写出对应信号的表达式。但在实际中,我们观测到的信号往往是在示波器上的波形,此时该如何获得这些波形的数学表达式?
本质上讲,实际信号中都会带有随机性,是没有确定的数学表达式的。但在某些情况下,我们是预先知道信号的类型的,比如正弦波,但不知道信号的一些参数。例如幅值、频率和相位。如果这些参数知道了,便可以写出对应的信号数学表达式了。在这种情况下,从观测到的带有噪声的信号波形中回复处信号,则属于信号参数估计的内容了。
在实际应用中,信号的参数往往非常重要。下面举一个例子:如果手边只有一个万用表,但没有能够测量电容、电感的RCL桥,为了想知道一个电容器件的准确容值,可以将待测的电容与一个电阻串联在一起。电阻的阻值可以使用万用表精确测量。使用一个信号源产生一个正弦波信号施加在RC串联电路上,使用示波器同时测量信号源的信号以及RC分压后的信号。
根据电路原理,可以知道上述电路稳态输入输出正弦信号之间的关系如下:
因此,输入输出正弦信号的幅度之比为:
输入输出正弦信号的相位差为:
所以,只要能够测量出U,V两个正弦信号的幅度或者相位,频率,再加上已知电阻阻值R\1.,便可以计算出来待测电容的容值。
已知上面的串联电路中的电阻\nR\1.=1009欧姆。示波器显示波形的数值可以通过已经存储在CH12.MAT中,数值的采样时间间隔fs=10微妙。
请根据以上分析,求出待测电容\nC\1.的容值是多少。
提示:在MATLAB中通过load()命令读取CH12.MAT中的数据;
ch12(:,1) 是V的数据, ch12(:,2)是U的数据。
使用MATLAB中fit命令来估计数据中的参数。 f = fit(x,y,'fourier1')
上面fit命令输出 f(x)=a0+a1cos(xw)+b1sin(xw) 中的a0,a1,b1,w等参数。
使用MATLAB计算出现的问题
使用MATLAB计算步骤调入数据并绘制波形图
load ch12'
t = linspace(0, 1400*10e-6,1400)'
plot(t,ch12(:,1), t, ch12(:, 2))'
(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
2. 使用MATLAB计算出现的问题
使用上述参数利用两个公式计算,会出现1.5倍的差异。
相关的矢量方差如下图所示:
从MATLAB通过剪切板得到数据
首先在MATLAB命令窗口使用如下命令将CH12数据拷贝到WINDOWS剪切板。
cc(ch12)
然后通过下面的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()
进行函数拟合和参数计算
程序代码如下:
#!/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
#============================================================
根据上面的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
python示波器 波形数据_通过示波器数据进行正弦信号参数估计相关推荐
- 算命数据_未来的数据科学家或算命精神向导
算命数据 Real Estate Sale Prices, Regression, and Classification: Data Science is the Future of Fortune ...
- 通过示波器数据进行正弦信号参数估计
实验要求 在第一次作业中的第二小题,练习了根据信号的波形写出对应信号的表达式.但在实际中,我们观测到的信号往往是在示波器上的波形,此时该如何获得这些波形的数学表达式? 测量波形的示波器 本质上讲,实际 ...
- 时间序列python复杂网络实例_基于时间序列数据的复杂网络重构
摘要:现实生活中,复杂系统俯首即是,和人们的生活息息相关,遍及的领域包括社会,经济,物理,生物和生态等.为了便于研究,复杂网络通常被看成是复杂系统的一种抽象描述,其中,网络中的单个节点对应于系统中的单 ...
- python收取wss数据_大宗商品现货数据不好拿?商品季节性难跟踪?Python爬虫一键解决没烦恼...
更多精彩内容,欢迎关注公众号:数量技术宅 季节性在大宗商品的交易中至关重要 大宗商品交易中,特别是在期货市场,由于商品价格周期的存在,季节性作为一种确定性相对较高的周期波动,对于某些品种,比如农产品, ...
- python的顶级库_三大用于数据科学的顶级Python库
Python有许多吸引力,如效率,代码可读性和速度,使其成为数据科学爱好者的首选编程语言.Python通常是希望升级其应用程序功能的数据科学家和机器学习专家的首选. 由于其广泛的用途,Python拥有 ...
- python数据处理电脑配置_『大数据python计算机基础教学视频教程』入门学python需要什么配置的电脑...
x = 1 if x 4.2 1) else匹前的缩进相同且最接近的if 2) 改之前y=x 2行,之后是y=x 1先执行 第5题 代码还n = 1 while n <= 5: i = 1 wh ...
- 为什么不用python做大数据_光环大数据告诉你为什么说:人生苦短,我用Python
首先我们要说明的是本文不扯什么大道理,只是先介绍Python的背景,然后从实用的角度出发举一两个真实栗子. 首先要想了解要一门语言的好坏,或者为什么招程序员喜欢(卧槽,原来程序员喜欢不是女朋友?)我们 ...
- python制作数据库报表_如何制作数据报表并实现自动化?
定期的数据报表,包括日报.周报.月报.半年报.年报,是每一位数据运营或数据分析师可能遇到的工作,需求方主要包括产品运营部门和各业务部门.基于不同公司的不同发展阶段,遇到的报表工作"层次&qu ...
- 数据中台是下一代大数据_全栈数据科学:下一代数据科学家群体
数据中台是下一代大数据 重点 (Top highlight) Data science has been an eye-catching field for many years now to you ...
最新文章
- python中abc属于字符串吗_Python基础学习:字符串
- 这个世界,正在悄悄惩罚那些不注意身体的人
- [html] 如何禁止input输入的历史记录
- 初学Java编程经常遇到的问题,你们遇到过吗?
- 爷青结,Microsoft 放弃 Windows 95 时代的图标
- php循环 跳转语句,golang循环跳转语句
- 性能测试--JMeter性能测试工具(简介,环境搭建,环境变量,基本按钮等基本介绍)【2】
- 2010中国十大杰出IT博客大赛—唯有行动才能改造命运
- html评分图标,Bootstrap图标实现移动端的星星评分功能
- 【简单示例:数据库表转XML】
- SpringBoot(53) 整合canal实现数据同步
- IC学习笔记9——多比特信号的跨时钟域处理方法之“MUX/DMUX同步器”
- idea Lombok插件下载
- PEANUT-WF模块开发-HslCommunicationEx
- win10无法防问其他计算机没有权限,Win10无internet访问权限怎么解决?
- 嵌入式物联网软件开发实战系列(STM32+FreeRTOS)
- CH559L单片机ADC介绍以及ADC采样案例
- C# List集合快速拼接字符串
- k8s在华为openeuler搭建
- Spring Cloud Gateway +Oauth2 +JWT+Vue 实现前后端分离RBAC权限管理