请求协助在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
相关产品推荐
相关产品推荐

