@TOC
首先,我们应该先理解一下,补码跟原码之间是如何转换的,
- 正数的补码等于原码
- 负数的补码等于符号位不变,其它位取反,再加1
十制数 | 原码 | 补码 |
---|---|---|
+15 | 0b 0000 1111 | 0b 0000 1111 |
-15 | 0b 1000 0000 | 0b 1111 0001 |
也就是说,给一个16位的AD补码值,首先我们可以根据首位是否为1来判断该AD值的正负,
- 符号位等于0(正数),原码=补码
- 符号位等于1(负数),补码符号位不变,其余位取反,再整体加1,就是该补码的原码的绝对值,注意此时还要对计算出来的原码加负号,才是最终的AD值
根据AD7606数据手册,
我们可以知道,AD7606B并行数据为16位,即数据范围为0b 1000 0000 0000 0000 ~ 0b 0111 1111 1111 1111,以$\pm 5V$范围为例,
import numpy as np
int_number_array = np.array([0xFFFF,0x1FFF,0X0FEE,0x15AC,0x159E,0x3C55,0x0001,0x0010])#含8个数据的数组,代表AD7606B八通道读取的补码数据
index = np.argwhere(int_number_array & 0b1000000000000000 == 0b1000000000000000)#查找数组中符号位为1(负数),返回索引数组
int_number_array[index] = -((int_number_array[index] ^ 0b1111111111111111) + 1)#进行补码转换成原码(按位异或相当于按位取反)正数不变,负数进行取反加1,最后加负号
number_array = int_number_array / 32768 * 5 #将十六进制原码数据转换电压值
print(number_array)
最后计算结果为
[-1.52587891e-04 1.24984741e+00 6.22253418e-01 8.46557617e-01 8.44421387e-01 2.35671997e+00 1.52587891e-04 2.44140625e-03]
分别代表每个通道的某个时刻的电压值,若连续处理一段时间的AD采样值,则可以绘制出8通道的波形图。
python读取matlab数据(.mat文件)
我们都知道,matlab是一个非常好用的矩阵计算分析软件,然额,matlab自带的绘图效果极为锯齿,所以,这里分享一个在python中读取matlab处理后的数据.mat文件。
1.首先,我们这里先打开matlab,随便在命令行窗输入两个变量,
matlab_x=1:0.01:10;
matlab_y=sin(matlab_x);
2.计算处理后,matlab右边的工作区会有两个变量值,分别为matlab_y、matlab_x
3.然后,我们将鼠标放置在工作区空白位置右键,选择保存,也可以在工作区处于工作高亮状态时使用快捷键ctrl+s进行保存,会弹出保存文件名,这里我们保存为matlab.mat
4.接下来就是用Python读取上一步中保存的matlab工作区的数据Data。Python中我们需要用到scipy库,这里我们先import进去
import scipy.io as scio
5.读取.mat文件
data=scio.loadmat('./matlab.mat')
6.查看当前data数据类型
type(data)
输出的为dict字典类型
7.读取对应我们想要的数据
这里我们假设需要将数据matlab_y读进python中(这里我们用numpy库将数据转化为数组类型)
import numpy as np #导入矩阵处理库
python_y=np.array(data['matlab_y']) #将matlab数据赋值给python变量
至此,就完成了使用python读取matlab数据。
enjoy it!