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

请求协助在BPSK代码中实现DSSS(直接序列扩频)

直接序列扩频(DSSS)与BPSK集成实现方案

核心逻辑梳理

DSSS集成到BPSK的关键是:用伪随机(PN)码对基带二进制信号扩频,再将扩频信号送入BPSK调制链路;接收端先解扩再解调。以下是修正后的完整实现代码及错误排查说明:

完整可运行代码

import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import butter, filtfilt

# 1. 生成二进制基带信息
bit_rate = 100  # 比特率
num_bits = 20   # 生成比特数
bits = np.random.randint(0, 2, num_bits)

# 2. 生成PN码(DSSS核心扩频码)
pn_seq_length = 10  # 扩频因子:每个比特对应10个码片
pn_seq = np.random.randint(0, 2, pn_seq_length)
pn_seq_bipolar = 2 * pn_seq - 1  # 转换为双极性(-1,1)便于运算

# 3. 基带信号扩频
baseband_signal = np.repeat(bits, pn_seq_length)
baseband_bipolar = 2 * baseband_signal - 1
spread_signal = baseband_bipolar * np.tile(pn_seq_bipolar, num_bits)

# 4. BPSK调制
carrier_freq = 1000  # 载波频率
sampling_rate = 10 * carrier_freq  # 采样率为载波10倍
t_total = num_bits / bit_rate
t = np.linspace(0, t_total, int(sampling_rate * t_total))

carrier = np.cos(2 * np.pi * carrier_freq * t)
# 扩频信号上采样匹配采样率
spread_signal_upsampled = np.repeat(spread_signal, int(sampling_rate / (bit_rate * pn_seq_length)))
bpsk_modulated = spread_signal_upsampled * carrier

# 5. 添加噪声(AWGN + 脉冲噪声)
snr_db = 10
snr = 10 ** (snr_db / 10)
signal_power = np.mean(bpsk_modulated ** 2)
noise_power = signal_power / snr

awgn_noise = np.random.normal(0, np.sqrt(noise_power), len(bpsk_modulated))
# 生成脉冲噪声(占比10%,幅度为信号峰值2倍)
pulse_noise = np.zeros_like(bpsk_modulated)
pulse_indices = np.random.choice(len(pulse_noise), int(0.1 * len(pulse_noise)), replace=False)
pulse_noise[pulse_indices] = 2 * np.max(bpsk_modulated) * np.random.choice([-1,1], len(pulse_indices))

received_signal = bpsk_modulated + awgn_noise + pulse_noise

# 6. 接收端:解扩+解调
# 相干解调
demodulated = received_signal * carrier
# 低通滤波
def lowpass_filter(data, cutoff, fs, order=5):
    nyq = 0.5 * fs
    normal_cutoff = cutoff / nyq
    b, a = butter(order, normal_cutoff, btype='low', analog=False)
    return filtfilt(b, a, data)

filtered = lowpass_filter(demodulated, 2 * bit_rate * pn_seq_length, sampling_rate)

# 解扩:积分判决
despread_signal = []
samples_per_bit = int(sampling_rate / bit_rate)
samples_per_chip = int(samples_per_bit / pn_seq_length)

for i in range(num_bits):
    bit_samples = filtered[i*samples_per_bit : (i+1)*samples_per_bit]
    pn_upsampled = np.repeat(pn_seq_bipolar, samples_per_chip)
    chip_mult = bit_samples * pn_upsampled
    bit_value = np.sum(chip_mult)
    despread_signal.append(1 if bit_value > 0 else 0)

despread_signal = np.array(despread_signal)

# 7. 绘图验证
plt.figure(figsize=(15, 10))

plt.subplot(4,1,1)
plt.stem(range(num_bits), bits, use_line_collection=True)
plt.title('原始二进制信息')
plt.xlabel('比特索引')
plt.ylabel('比特值')
plt.grid(True)

plt.subplot(4,1,2)
plt.plot(t[:len(spread_signal_upsampled)], spread_signal_upsampled)
plt.title('DSSS扩频信号')
plt.xlabel('时间(s)')
plt.ylabel('幅度')
plt.grid(True)

plt.subplot(4,1,3)
plt.plot(t, received_signal)
plt.title('含噪声的接收BPSK信号')
plt.xlabel('时间(s)')
plt.ylabel('幅度')
plt.grid(True)

plt.subplot(4,1,4)
plt.stem(range(num_bits), despread_signal, use_line_collection=True)
plt.title('解扩解调后的二进制信息')
plt.xlabel('比特索引')
plt.ylabel('比特值')
plt.grid(True)

plt.tight_layout()
plt.show()

无有效绘图问题排查

  • PN码同步错误:接收端解扩必须使用与发送端完全一致的PN码,且码片时序对齐,否则解扩后信号完全失真,无有效波形。
  • 采样率不匹配:扩频信号上采样时需严格匹配载波采样率,否则调制后信号时序错乱,绘图显示混乱。
  • 滤波参数异常:低通滤波截止频率需覆盖扩频后信号带宽,否则会滤除有效信号,导致解扩失败。
  • 噪声过载:脉冲噪声幅度过大或占比过高时,会直接淹没有效信号,需调整噪声参数至合理范围。

内容的提问来源于stack exchange,提问作者Kervin Aranzado

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 03:35:14