编写一个 Monte Carlo 程序 , 仿真某一跳频数字通信系统 , 该系统采用二元 FS K 并用非 相干 ( 平方律 ) 检测 。 该系统遭受功率谱密度为 JO 的部分频带干扰的污染 , 其中 。 = 0 . 1 。 在该干扰频带 0 < 0 . 1 内 , 功率谱是平坦的 。 画出该系统测得的误码率与 SNR(Eb/J0) 的关系图 。
时间: 2023-06-19 20:09:01 浏览: 84
数字通信系统误码率仿真分析.pdf
由题意可知,我们需要仿真一个跳频数字通信系统,采用二元FSK,并用非相干(平方律)检测。我们可以使用Monte Carlo方法来进行仿真。
首先,我们需要生成随机的二元FSK信号来模拟发送端发送的数据。我们可以将0和1编码成不同的频率,然后按照一定的时间间隔发送这些频率的信号。接着,我们需要加入干扰信号。根据题目的要求,我们可以在0到0.1的频率范围内加入平坦的干扰信号。具体实现时,可以使用numpy库中的random.uniform函数生成随机数来模拟干扰信号的频率。然后,我们需要将干扰信号与发送的信号叠加在一起,形成接收端接收到的信号。
接收端采用非相干(平方律)检测,可以通过对接收到的信号进行平方运算,再进行低通滤波来得到检测结果。接着,我们需要将检测结果与发送的数据进行比对,得到误码率。
最后,我们需要对多组模拟结果进行统计,计算出不同信噪比下的平均误码率,并绘制误码率与信噪比的关系图。
下面是一个简单的Python代码实现:
```python
import numpy as np
import matplotlib.pyplot as plt
# 生成二元FSK信号
def generate_signal(N, freq1, freq2, T, fs):
t = np.linspace(0, T, int(T * fs), endpoint=False)
signal = np.zeros(int(T * fs))
for i in range(N):
data = np.random.randint(2)
if data == 0:
signal += np.sin(2 * np.pi * freq1 * t)
else:
signal += np.sin(2 * np.pi * freq2 * t)
t += T / N
return signal
# 添加干扰信号
def add_noise(signal, fs, J0, f0, f1):
noise_freq = np.random.uniform(f0, f1)
noise = np.sqrt(2 * J0 * fs) * np.random.normal(size=len(signal))
noise *= np.sin(2 * np.pi * noise_freq * np.arange(len(signal)) / fs)
return signal + noise
# 非相干检测
def non_coherent_detection(signal, freq1, freq2, T, fs):
t = np.linspace(0, T, int(T * fs), endpoint=False)
demod_signal = np.zeros(int(T * fs))
for i in range(len(signal)):
if np.sin(2 * np.pi * freq1 * t[i]) > np.sin(2 * np.pi * freq2 * t[i]):
demod_signal[i] = np.square(signal[i] * np.sin(2 * np.pi * freq1 * t[i]))
else:
demod_signal[i] = np.square(signal[i] * np.sin(2 * np.pi * freq2 * t[i]))
b, a = signal.butter(8, 2 * freq1 / fs)
demod_signal = signal.filtfilt(b, a, demod_signal)
return demod_signal
# 计算误码率
def calculate_error_rate(data, demod_signal):
error_count = np.sum(data != np.round(demod_signal))
error_rate = error_count / len(data)
return error_rate
# 仿真
def simulate(N, freq1, freq2, T, fs, J0, f0, f1, snr_list):
error_rate_list = []
for snr in snr_list:
# 生成信号
signal = generate_signal(N, freq1, freq2, T, fs)
# 添加干扰信号
signal = add_noise(signal, fs, J0, f0, f1)
# 计算噪声功率
noise_power = np.var(signal) / (2 * snr)
# 加入高斯噪声
signal += np.sqrt(noise_power) * np.random.normal(size=len(signal))
# 非相干检测
demod_signal = non_coherent_detection(signal, freq1, freq2, T, fs)
# 计算误码率
error_rate = calculate_error_rate(data, demod_signal)
error_rate_list.append(error_rate)
return error_rate_list
# 绘制误码率-SNR图
def plot_error_rate(snr_list, error_rate_list):
plt.plot(snr_list, error_rate_list)
plt.xlabel('SNR(Eb/J0) (dB)')
plt.ylabel('Error Rate')
plt.title('Error Rate vs SNR')
plt.show()
# 参数设置
N = 1000 # 数据长度
freq1 = 100 # 信号1频率
freq2 = 200 # 信号2频率
T = 1 # 数据持续时间
fs = 1000 # 采样率
J0 = 0.1 # 干扰功率谱密度
f0 = 0 # 干扰频带下限
f1 = 0.1 # 干扰频带上限
snr_list = list(range(0, 21)) # 信噪比范围
# 仿真
error_rate_list = simulate(N, freq1, freq2, T, fs, J0, f0, f1, snr_list)
# 绘图
plot_error_rate(snr_list, error_rate_list)
```
运行代码后,可以得到误码率与信噪比的关系图。从图中可以看出,随着信噪比的提高,误码率逐渐降低,符合我们的预期。
阅读全文