Python OOP入门求助:BSC输出异常与独立绘图实现问题
问题解答
问题1:BSC类传入数组却返回单个snr_BSC值的原因
你的error_probability = np.arange(start=1e-12, stop=1)代码存在逻辑问题:np.arange默认步长为1,而1e-12 + 1 远大于stop值1,所以生成的数组只有单个元素(1e-12),因此计算出的snr_BSC自然是单个值。
解决办法:指定合适步长,或者用np.logspace生成对数分布的概率数组(更适配后续对数坐标绘图),示例:
# 生成100个从1e-12到1的对数分布概率值 error_probability = np.logspace(-12, 0, 100)
另外,你的ADC类m属性存在语法错误:直接使用未定义的n_bit变量,需改为实例属性self.n_bit,否则会抛出NameError:
@property def m(self): M = 2 ** self.n_bit # 修正为self.n_bit return M
问题2:绘制两个独立的matplotlib图形
有两种常用实现方式:
方式1:创建两个独立画布
分别调用plt.figure()生成新画布,在不同画布上完成绘图。
方式2:子图布局(推荐,便于对比)
用plt.subplots创建1行2列的子图,分别在两个子轴上绘图。
修改后的完整代码
import numpy as np import matplotlib.pyplot as plt import matplotlib.colors as mcol color_dict = mcol.TABLEAU_COLORS def lin2db(x): return 10*np.log10(x) def db2lin(x): return 10**(x/10) class ADC(): def __init__(self,n_bit): self.n_bit=n_bit @property def snr(self): n_bit=self.n_bit M=2**n_bit snr_lin=M**2 return snr_lin @property def snr_db(self): snr_lin=self.snr snr_db=lin2db(snr_lin) return snr_db @property def m(self): M=2**self.n_bit # 修正语法错误 return M class BSC(): def __init__(self,error_probability): self.error_probability=error_probability @property def snr_BSC(self): error_probability=self.error_probability snr_lin_BSC=1/(4*error_probability) return snr_lin_BSC @property def snr_db(self): snr_lin_BSC = self.snr_BSC snr_db = lin2db(snr_lin_BSC) return snr_db def exercise1(): fs_step = 2.75625e3 # 修正:生成对数分布的概率数组,共100个点 error_probability = np.logspace(-12, 0, 100) n_bit = np.array([2, 3, 4, 6, 8, 10, 12, 14, 16], dtype=np.int64) adc=ADC(n_bit) bsc=BSC(error_probability) print('Quantization SNR',adc.snr) print('Quantization SNR_BSC', bsc.snr_BSC) # 方式1:两个独立Figure # 第一个图:ADC的SNR vs n_bit plt.figure(figsize=(8,5)) plt.plot(n_bit,adc.snr_db, color=color_dict['tab:blue']) plt.xlabel('n_bit') plt.ylabel('SNR in dB') plt.title('ADC Quantization SNR') plt.grid(True) # 第二个图:BSC的SNR vs error probability plt.figure(figsize=(8,5)) plt.plot(error_probability,bsc.snr_db, color=color_dict['tab:orange']) plt.xlabel('P_e') plt.xscale('log') plt.ylabel('SNR in dB') plt.title('BSC SNR') plt.grid(True) plt.show() # # 方式2:子图布局(取消注释即可使用) # fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14,5)) # # 第一个子图 # ax1.plot(n_bit, adc.snr_db, color=color_dict['tab:blue']) # ax1.set_xlabel('n_bit') # ax1.set_ylabel('SNR in dB') # ax1.set_title('ADC Quantization SNR') # ax1.grid(True) # # 第二个子图 # ax2.plot(error_probability, bsc.snr_db, color=color_dict['tab:orange']) # ax2.set_xlabel('P_e') # ax2.set_xscale('log') # ax2.set_ylabel('SNR in dB') # ax2.set_title('BSC SNR') # ax2.grid(True) # plt.tight_layout() # plt.show() exercise1()
内容的提问来源于stack exchange,提问作者Severjan Lici
相关产品推荐
相关产品推荐

