pyqt5:py处理C语言格式数组和有符号数的转换(备忘录)

文章详细描述了如何将C语言中的十六进制数组转换为Python数组,并使用numpy处理这些数据以生成正弦波形。通过将十六进制数值转换为16位带符号整型,处理负数并利用matplotlib进行绘图。此外,还提供了从正弦波数据生成C数组的代码示例。
摘要由CSDN通过智能技术生成


AB32VG1在音频口输出正弦波源码: sddac_test.c

1.问题:把下面的数组所表示的正弦波用曲线描绘出来。

AB32VG1是小端存储。

const unsigned char hexData[96] = {
    0x00, 0x00, 0xB5, 0x10, 0x21, 0x21, 0xFC, 0x30, 0x00, 0x40, 0xEC, 0x4D, 0x82, 0x5A, 0x8D, 0x65,
    0xDA, 0x6E, 0x42, 0x76, 0xA3, 0x7B, 0xE8, 0x7E, 0xFF, 0x7F, 0xE8, 0x7E, 0xA3, 0x7B, 0x42, 0x76,
    0xDA, 0x6E, 0x8D, 0x65, 0x82, 0x5A, 0xEC, 0x4D, 0x00, 0x40, 0xFC, 0x30, 0x21, 0x21, 0xB5, 0x10,
    0x00, 0x00, 0x4B, 0xEF, 0xDF, 0xDE, 0x04, 0xCF, 0x00, 0xC0, 0x14, 0xB2, 0x7E, 0xA5, 0x73, 0x9A,
    0x26, 0x91, 0xBE, 0x89, 0x5D, 0x84, 0x18, 0x81, 0x00, 0x80, 0x18, 0x81, 0x5D, 0x84, 0xBE, 0x89,
    0x26, 0x91, 0x73, 0x9A, 0x7E, 0xA5, 0x14, 0xB2, 0x00, 0xC0, 0x04, 0xCF, 0xDF, 0xDE, 0x4B, 0xEF 
};

转换后:
在这里插入图片描述

1.1 将C语言数组直接替换为py数组

python数组:

hexData= [
    0x00, 0x00, 0xB5, 0x10, 0x21, 0x21, 0xFC, 0x30, 0x00, 0x40, 0xEC, 0x4D, 0x82, 0x5A, 0x8D, 0x65,
    0xDA, 0x6E, 0x42, 0x76, 0xA3, 0x7B, 0xE8, 0x7E, 0xFF, 0x7F, 0xE8, 0x7E, 0xA3, 0x7B, 0x42, 0x76,
    0xDA, 0x6E, 0x8D, 0x65, 0x82, 0x5A, 0xEC, 0x4D, 0x00, 0x40, 0xFC, 0x30, 0x21, 0x21, 0xB5, 0x10,
    0x00, 0x00, 0x4B, 0xEF, 0xDF, 0xDE, 0x04, 0xCF, 0x00, 0xC0, 0x14, 0xB2, 0x7E, 0xA5, 0x73, 0x9A,
    0x26, 0x91, 0xBE, 0x89, 0x5D, 0x84, 0x18, 0x81, 0x00, 0x80, 0x18, 0x81, 0x5D, 0x84, 0xBE, 0x89,
    0x26, 0x91, 0x73, 0x9A, 0x7E, 0xA5, 0x14, 0xB2, 0x00, 0xC0, 0x04, 0xCF, 0xDF, 0xDE, 0x4B, 0xEF 
   ]

1.2 使用numpy读入数组

AB32VG1是小端存储,即低字节存放于低地址。以最后一组数据 hexData[94,95]=0x4B, 0xEF 为例分析。
hexData[95]= 0xEF 是高字节,所以计算如下:
dat = 0xEF*256 + 0x4B = 0xEF4B 。此时打印出来为十进制 61259:

>>>print(dat)
61259

python没有16位带符号整型,要转换成对应的负数:

dat = dat -0x10000

再次打印:

>>>print(dat)
-4277

1.3完整代码

import matplotlib.pyplot as plt  #画图包
import numpy as np 
#   1.从C语言拷贝过来的数据
hexData= [
    0x00, 0x00, 0xB5, 0x10, 0x21, 0x21, 0xFC, 0x30, 0x00, 0x40, 0xEC, 0x4D, 0x82, 0x5A, 0x8D, 0x65,
    0xDA, 0x6E, 0x42, 0x76, 0xA3, 0x7B, 0xE8, 0x7E, 0xFF, 0x7F, 0xE8, 0x7E, 0xA3, 0x7B, 0x42, 0x76,
    0xDA, 0x6E, 0x8D, 0x65, 0x82, 0x5A, 0xEC, 0x4D, 0x00, 0x40, 0xFC, 0x30, 0x21, 0x21, 0xB5, 0x10,
    0x00, 0x00, 0x4B, 0xEF, 0xDF, 0xDE, 0x04, 0xCF, 0x00, 0xC0, 0x14, 0xB2, 0x7E, 0xA5, 0x73, 0x9A,
    0x26, 0x91, 0xBE, 0x89, 0x5D, 0x84, 0x18, 0x81, 0x00, 0x80, 0x18, 0x81, 0x5D, 0x84, 0xBE, 0x89,
    0x26, 0x91, 0x73, 0x9A, 0x7E, 0xA5, 0x14, 0xB2, 0x00, 0xC0, 0x04, 0xCF, 0xDF, 0xDE, 0x4B, 0xEF 
   ]

#	2.生成x轴数据
cnt = 48
x=np.linspace(1, cnt,cnt, dtype=int)

#	3.生成y轴空数据
y=np.empty([48], dtype = int, order = 'C')
dat=0 
i=0
j=0
#   4.生成y轴数据
while i < len(hexData):
    dat=hexData[i+1]*256 + hexData[i]
    #   数值大于0x7fff为负数
    if dat > 0x7fff :	
        y[j]=dat-0x10000
    else:
        y[j]=dat
    print(dat)
    i += 2
    j+=1
#   5.绘图    
plt.plot(x,y,'bp--') #绘制成图表    
plt.show()
#   6.写入文本存档
np.savetxt("pcm001-48.txt",(y),delimiter=',',fmt="%d",newline='\n')

2.从正弦波数据生成C数组

2.1 正弦波数据

上面的C数组对应数据如下:

0		,
4277    ,
8481    ,
12540   ,
16384   ,
19948   ,
23170   ,
25997   ,
28378   ,
30274   ,
31651   ,
32488   ,
32767   ,
32488   ,
31651   ,
30274   ,
28378   ,
25997   ,
23170   ,
19948   ,
16384   ,
12540   ,
8481    ,
4277    ,
0       ,
-4277   ,
-8481   ,
-12540  ,
-16384  ,
-19948  ,
-23170  ,
-25997  ,
-28378  ,
-30274  ,
-31651  ,
-32488  ,
-32768  ,
-32488  ,
-31651  ,
-30274  ,
-28378  ,
-25997  ,
-23170  ,
-19948  ,
-16384  ,
-12540  ,
-8481   ,
-4277

2.2 负数转成16位带符号整型公式

上面知道表示负数的16位带符号整型转成负数的公式如下:

if dat > 0x7fff:
	dat = dat -0x10000

这里是逆运算:

    if dat <0 :
        dat=dat+0x10000

2.3 负数转成16位带符号整型 完整代码

注意存储是小端模式。

import numpy as np 
#   1.正弦波数据
hexData= [
    0		,
    4277    ,
    8481    ,
    12540   ,
    16384   ,
    19948   ,
    23170   ,
    25997   ,
    28378   ,
    30274   ,
    31651   ,
    32488   ,
    32767   ,
    32488   ,
    31651   ,
    30274   ,
    28378   ,
    25997   ,
    23170   ,
    19948   ,
    16384   ,
    12540   ,
    8481    ,
    4277    ,
    0       ,
    -4277   ,
    -8481   ,
    -12540  ,
    -16384  ,
    -19948  ,
    -23170  ,
    -25997  ,
    -28378  ,
    -30274  ,
    -31651  ,
    -32488  ,
    -32768  ,
    -32488  ,
    -31651  ,
    -30274  ,
    -28378  ,
    -25997  ,
    -23170  ,
    -19948  ,
    -16384  ,
    -12540  ,
    -8481   ,
    -4277
   ]
i=0
#	2.生成96个数据存储空间
y=np.empty([96], dtype = int, order = 'C')
dat=0 
j=0
while i < len(hexData):
    dat=hexData[i]
    if dat <0 :
        dat=dat+0x10000
    
    print(dat)
    y[j] = dat %  256
    j+=1
    y[j] = dat / 256
    j+=1
    i += 1
#   3. 保存到文本
np.savetxt("pcm001-96.txt",(y),delimiter=',',fmt="0x%02x",newline='\n')

3. 生成正弦波数据的代码

import matplotlib.pyplot as plt  #画图包
import numpy as np 

#   1.从0 - 2 pi 等长取48个点,作为 x 轴数据
x=np.linspace(0*np.pi,2*np.pi,12*4) #
#   2. 根据x轴生成y轴数据
y=32768*np.sin(x) #调整32768这个值可以调整幅值
#   3.取整
y1=y.astype(int) #把y值转换成整数
#   4.绘制成图表
plt.plot(x,y1,'bp--') 
plt.show()

#   5.正弦波数据存入txt文件
np.savetxt("pcm-48.txt",(y1),delimiter=',',fmt="%d",newline='\n')

在这里插入图片描述

生成的数据 《pcm-48.txt》 如下:

0
4367
8657
12792
16699
20307
23554
26380
28735
30578
31875
32603
32749
32311
31296
29723
27619
25023
21980
18544
14778
10748
6526
2188
-2188
-6526
-10748
-14778
-18544
-21980
-25023
-27619
-29723
-31296
-32311
-32749
-32603
-31875
-30578
-28735
-26380
-23554
-20307
-16699
-12792
-8657
-4367
0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值