- 根据采样点数,采样周期数等参数以及波形的数学表达式,生成任意波形
- 将波形数据转为指定位宽的二进制补码,然后存为txt
- 绘制原始波形和转换为二进制补码后的波形,验证转换是否正确
''' Author : Xu Dakang Email : XudaKang_up@qq.com Date : 2021-11-19 19:12:31 LastEditors : Xu Dakang LastEditTime : 2021-11-22 15:15:08 Filename : Description : ''' ''' 模块功能: 1.根据采样点数,采样周期数等参数以及波形的数学表达式,生成任意波形 2.将波形数据转为指定位宽的二进制补码,然后存为txt 3.绘制原始波形和转换为二进制补码后的波形,验证转换是否正确 ''' import numpy as np import matplotlib.pyplot as plt from matplotlib.pylab import mpl mpl.rcParams['font.sans-serif'] = ['SimHei'] #显示中文 mpl.rcParams['axes.unicode_minus'] = False #显示负号 import mplcursors import time now_time = time.strftime("%Y%m%d-%H%M%S", time.localtime(time.time())) # 我的自编模块 import myBin2dec2hex #! 需要变更的参数 file_name = 'waveform-' + now_time N = 250 # 一个周期的采样点数,采样频率Fs = 信号频率f * 采样点数N TNUM = 10 # 采样周期数 BIT_WIDTH = 24 # 二进制补码位数 f = 0.5 # 正弦信号的频率,可任意取值 t0 = np.linspace(0, 1 / f, N) # np.linspace(开始, 结束, 个数),注意开始点会被包含,结束点可能被包含(如果能整除的话) pi = np.pi #! 更改y0的表达式以获得任意波形 # 正弦函数公式 y = sin(wt) = sin(2πft) y0 = np.sin(2 * pi * f * t0) + np.sin(2 * pi * f * 2 * t0) # y0 = np.sin(2 * pi * f * t0) #! 原始波形周期延拓,并绘制出延拓后的波形 x0_tnum = [] y0_tnum = [] y0_bit_tnum = [] for i in range(TNUM): for j in t0: x0_tnum.append(j + i * 1 / f) for k in y0: y0_tnum.append(k) plt.figure(1) plt.subplot(2, 1, 1) plt.plot(x0_tnum, y0_tnum) plt.grid() plt.title('原始波形,最小频率 = ' + str(f) + '对应周期为' + str(1/f) + ',周期数 = ' + str(TNUM) + ',采样频率 = ' + str(f * N)) mplcursors.cursor() # 使得可以在图像上取点 #! 原始波形小数乘以二进制放大倍数再取整 y0_bit = np.int0((2**(BIT_WIDTH - 1) - 1) * y0 / max(abs(y0))) y0_bit_tnum = [] for i in range(TNUM): for j in y0_bit: y0_bit_tnum.append(j) #! 将10进制转2进制补码,再存入txt文件中 fotxt = '' fo = open(file_name + '.txt', 'w', encoding='utf8') for dec_num in y0_bit_tnum: # 不包括最后一个数 fotxt += myBin2dec2hex.signed_dec2bin(dec_num, BIT_WIDTH)[2:] + 'n' fo.write(fotxt[:-1]) print('生成' + file_name + '.txt文件成功!') fo.close() #! 读取写入的txt文件,转为10进制并画出波形,以验证写入是否正确 fi = open(file_name + '.txt', 'r', encoding='utf8') y_out = [] for line in fi.readlines(): y_out.append(myBin2dec2hex.signed_bin2dec(line)) fi.close() x_out = list(range(len(x0_tnum))) plt.figure(1) plt.subplot(2, 1, 2) plt.plot(x_out, y_out) plt.grid() plt.title('先转二进制补码再转10进制后波形, 相当于十进制值乘以2^' + str(BIT_WIDTH - 1) + ' - 1即' + str('{:e}'.format(2**(BIT_WIDTH - 1) - 1))) mplcursors.cursor() plt.show()
四. 说明
代码中使用了自编模块myBin2dec2hex,请参考我的另一篇博客:
Python进制转换的完全实现——2/10/16进制原/补码互转_徐大康的博客-CSDN博客
其余import的都是第三方库,可通过pip install 库名来安装。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)