python与matlab一些常用函数互转
Posted 程序媛秃秃
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python与matlab一些常用函数互转相关的知识,希望对你有一定的参考价值。
1、十六进制字节流数据
有一个二进制文本data
如下:
b"\\xd0\\x01n\\x01\\xb3\\x1b\\x07\\x05\\xee\\x06\\xcc\\xfe\\x84\\x12\\xab\\x07~\\x08p\\x00\\x92\\x14u\\x01\\xe4\\x12d\\xfe9\\x08\\xb0\\x1e\\xa6\\x02\\xb1C?\\x18#E\\x12\\x12\\x13^v\\x04w\\x1d\\xe8\\x04\\x9bf\\x1a\\x1c\\x9b\\x0b\\xb0\\x11\\xae%#\\x06\\xbe\\x1f^\\x15s.\\x92\\x10k'`\\x0b[ \\x03!\\x00 \\x1b\\xdf(\\xec#\\xfcH=\\x02\\x1e\\x11!\\x07\\xba\\xedu \\xa7\\x0e\\xdb\\x0by\\xfb\\x91\\x05H\\x03\\xcb\\x08\\x94\\x04\\xfd\\x13n\\xf8\\x07\\x06d\\xfd\\xaf\\t\\x17\\xda$y\\x10"
这些数据是设备通过TCP传上来的,经过小端
变换的十六进制字节流数据。
可以使用以下文件转换后查看。
方式1:
import struct
def updack_data(data):
# 十六进制字节流转十进制
dec_data = []
for i in range(0, len(data), 2):
dec_data.append(struct.unpack("@h", data[i: i + 2])[0]) # 小端
return dec_data
with open('data', 'rb') as f:
signal = f.read()
print(updack_data(signal))
方式2:
import numpy as np
a = b"\\xd0\\x01n\\x01\\xb3\\x1b\\x07\\x05\\xee\\x06\\xcc\\xfe\\x84\\x12\\xab\\x07~\\x08p\\x00\\x92\\x14u\\x01\\xe4\\x12d\\xfe9\\x08\\xb0\\x1e\\xa6\\x02\\xb1C?\\x18#E\\x12\\x12\\x13^v\\x04w\\x1d\\xe8\\x04\\x9bf\\x1a\\x1c\\x9b\\x0b\\xb0\\x11\\xae%#\\x06\\xbe\\x1f^\\x15s.\\x92\\x10k'`\\x0b[ \\x03!\\x00 \\x1b\\xdf(\\xec#\\xfcH=\\x02\\x1e\\x11!\\x07\\xba\\xedu \\xa7\\x0e\\xdb\\x0by\\xfb\\x91\\x05H\\x03\\xcb\\x08\\x94\\x04\\xfd\\x13n\\xf8\\x07\\x06d\\xfd\\xaf\\t\\x17\\xda$y\\x10"
print(np.fromstring(a, dtype=np.int16))
输出:
[464, 366, 7091, 1287, 1774, -308, 4740, 1963, 2174, 112, 5266, 373, 4836, -412, 2105, 7856, 678, 17329, 6207, 17699, 4626, 24083, 1142, 7543, 1256, 26267, 7194, 2971, 4528, 9646, 1571, 8126, 5470, 11891, 4242, 10091, 2912, 8283, 891, 33, 6944, 10463, 9196, 18684, 573, 4382, 1825, -4678, 8309, 3751, 3035, -1159, 1425, 840, 2251, 1172, 5117, -1938, 1543, -668, 2479, 6011, 9434, 4217]
2、fopen与open
打开文件。
matlab打开:
fid=fopen('data','rb');
python打开:
fid = open('data', 'rb')
data
是完整的文件名。
3、fread与fromfile
读取文件。
matlab读取:
signal=fread(fid,data_len,'int16'); %列向量
fread它是一个读取二进制数据的函数.第二个参数指定输出向量的大小,第三个参数指定读取的项的大小/类型.
python读取:
import numpy as np
signal = np.fromfile(fid, np.int16) # 转Int16
fid是一个文件对象,也可以直接打开一个文件名:
import numpy as np
signal = np.fromfile('data', np.int16) # 转Int16
其中data
是一个完整的文件名。
4、reshape
reshape是重塑数组,比如把一维数组转多维数组。
matlab:
signal1=reshape(signal,2,[]);
意思就是把一维的signal
转成2行n列数组。
python:
signal1 = signal.reshape((-1, 2)).T
-1表示n行,2表示两列, .T表示转置,即2行n列数组。
把一维数组转10行n列:
import numpy as np
phase = np.reshape(signal1[0], (-1, 10)).T
5、filter与lfilter
y = filter(b,a,x) 使用由分子和分母系数 b 和 a 定义的有理传递函数对输入数据 x 进行滤波。
matlab:
y=filter(HP,1,phase(1,:));
python:
from scipy.signal import lfilter
y = lfilter(b=HP, a=1, x=phase[0], axis=0) # 滤波
以上是关于python与matlab一些常用函数互转的主要内容,如果未能解决你的问题,请参考以下文章
利用ZYNQ SOC快速打开算法验证通路——MATLAB浮点数与定点二进制补码互转