文章目录
- 1.问题:把下面的数组所表示的正弦波用曲线描绘出来。
- 1.1 将C语言数组直接替换为py数组
- 1.2 使用numpy读入数组
- 1.3完整代码
- 2.从正弦波数据生成C数组
- 2.1 正弦波数据
- 2.2 负数转成16位带符号整型公式
- 2.3 负数转成16位带符号整型 完整代码
- 3. 生成正弦波数据的代码
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]
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) #调整43这个值可以调整波峰值
# 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