调幅、调频、调相、曼彻斯特编码、差分曼彻斯特编码的Python代码实现

一、简介

调幅 (Amplitude Modulation, AM)

        通过改变信号的幅度(信号强度)来表示数据,同时载波的频率和相位保持不变

调频 (Frequency Modulation, FM)

        通过改变信号的频率来表示数据,而载波的幅度和相位保持不变

调相 (Phase Modulation, PM)

        通过改变载波的相位来表示数据,幅度和频率保持不变

曼彻斯特编码 (Manchester Encoding)

        是一种用电平跳变来表示1或0的编码方法

        规则:上0下1(常用)、上1下0

差分曼彻斯特编码 (Differential Manchester Encoding)

        曼彻斯特编码的变体,通过差分变化而不是绝对电平变化来表示数据

        规则:数据由信号是否翻转决定:1无翻转;0有翻转

二、源代码

注意:下载图片那段代码被注释了,如若需要,取消注释即可

import numpy as np
import matplotlib.pyplot as plt
import os

"""
    目的:该文件用于生成编码、调制后的图像
    输入:01字符串
    输出:图片
"""


def generate_signals(data, bit_duration=1, high_amp=1, low_amp=0.2, high_freq=10, low_freq=5):
    time = np.linspace(0, len(data) * bit_duration, len(data) * 100)  # 用于生成一个时间数组,用于绘制信号随时间变化的图
    DME_time=np.linspace(-1, len(data) * bit_duration, (len(data)+1) * 100)

    am_signal = []
    fm_signal = []
    pm_signal = []
    manchester_signal = []
    diff_manchester_signal = []


    prev_phase = 0
    prev_diff_signal = 1

    diff_manchester_signal.extend([1 - prev_diff_signal]*50 + [1 - prev_diff_signal] * 50)  # 初始前面一小段

    for bit in data:
        t = np.linspace(0, bit_duration, 100, endpoint=False)

        if bit == '1':
            # 调幅
            am_signal.extend(high_amp*np.sin(2 * np.pi * low_freq * t))
            # 调频
            fm_signal.extend(np.sin(2 * np.pi * high_freq * t))
            # 调相
            prev_phase = np.pi  # 反转相位
            pm_signal.extend(np.sin(2 * np.pi * low_freq * t + prev_phase))
            # 曼彻斯特编码
            manchester_signal.extend([high_amp] * 50 + [low_amp] * 50)
            # 差分曼彻斯特编码
            diff_manchester_signal.extend([1 - prev_diff_signal] * 50 + [prev_diff_signal] * 50)
            prev_diff_signal = 1 - prev_diff_signal  # 边界跳变
        else:
            # 调幅
            am_signal.extend(low_amp*np.sin(2 * np.pi * low_freq * t))
            # 调频
            fm_signal.extend(np.sin(2 * np.pi * low_freq * t))
            # 调相
            pm_signal.extend(np.sin(2 * np.pi * low_freq * t))
            # 曼彻斯特编码
            manchester_signal.extend([low_amp] * 50 + [high_amp] * 50)
            # 差分曼彻斯特编码
            diff_manchester_signal.extend([prev_diff_signal] * 50 + [1 - prev_diff_signal] * 50)


    return time,DME_time, am_signal, fm_signal, pm_signal, manchester_signal, diff_manchester_signal


def plot_signals(time, DME_time, am_signal, fm_signal, pm_signal, manchester_signal, diff_manchester_signal):
    x_ticks = np.arange(0, len(time) // 100, 1)
    plt.figure(figsize=(12, 10))

    # 绘制调幅
    plt.subplot(5, 1, 1)
    plt.plot(time, am_signal, label="AM")
    plt.title("AM")
    plt.xticks(x_ticks)
    plt.ylim(-0.5, 1.5)
    plt.grid(True)

    # 绘制调频
    plt.subplot(5, 1, 2)
    plt.plot(time, fm_signal, label="FM")
    plt.title("FM")
    plt.xticks(x_ticks)
    plt.ylim(-1.5, 1.5)
    plt.grid(True)

    # 绘制调相
    plt.subplot(5, 1, 3)
    plt.plot(time, pm_signal, label="PM")
    plt.title("PM")
    plt.xticks(x_ticks)
    plt.ylim(-1.5, 1.5)
    plt.grid(True)

    # 绘制曼彻斯特编码
    plt.subplot(5, 1, 4)
    plt.plot(time, manchester_signal, label="Manchester Encoding", drawstyle='steps-pre')
    plt.title("Manchester Encoding")
    plt.xticks(x_ticks)
    plt.ylim(-0.5, 1.5)
    plt.grid(True)

    # 绘制差分曼彻斯特编码
    DME_x_ticks=[]
    DME_x_ticks.append(-1)
    DME_x_ticks.extend(x_ticks)

    plt.subplot(5, 1, 5)
    plt.plot(DME_time, diff_manchester_signal, label="Differential Manchester Encoding", drawstyle='steps-pre')
    plt.title("Differential Manchester Encoding")
    plt.xticks(DME_x_ticks)
    plt.ylim(-0.5, 1.5)
    plt.grid(True)

    # 调整布局
    plt.tight_layout()

    # file_name = f"ModulationImages/{input_data}.png"
    # if not os.path.exists(file_name):
    #     plt.savefig(file_name)
    #     print(f"图像已保存为 {file_name}")
    # else:
    #     print(f"图像已存在")

    plt.show()





# 示例输入字符串
input_data = "1010110011"

# 生成信号
time,DME_time, am_signal, fm_signal, pm_signal, manchester_signal, diff_manchester_signal = generate_signals(input_data)

# 绘制信号图
plot_signals(time,DME_time, am_signal, fm_signal, pm_signal, manchester_signal, diff_manchester_signal)

三、示例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值