You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 05:47:51