瑞利衰落信道仿真(Python)

本文介绍了在无线通信中如何使用对数正常阴影衰落和瑞利衰落模型来模拟多径效应下的信号衰减。通过定义距离依赖的路径损耗函数,结合随机生成的距离值和对数正态分布的阴影衰落,以及复高斯分布的瑞利衰落系数,生成了信道衰落系数数组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2024年4月24日16:46:31更新:
(这个比较正确)
在这里插入图片描述
重点是这个对数阴影衰落

    import numpy as np

    # Define distance-dependent path-loss function
    def path_loss(d):
        return 128.1 + 37.6 * np.log10(d)

    # Set the number of channels
    num_channels = 10

    # Simulate distances (assuming random distances for this example)
    distances = np.random.rand(num_channels) * 10  # Distances in kilometers

    # Calculate path loss for each channel
    path_loss_dB = path_loss(distances)

    # Apply log-normal shadowing (10 dB standard deviation) 
    # 阴
    shadowing = np.random.normal(scale=10, size=num_channels)

    # Convert path loss from dB to linear scale
    path_loss_linear = np.power(10, -path_loss_dB / 10)

    # Generate Rayleigh fading coefficients (complex numbers)
    fading = np.random.rayleigh(size=num_channels) * np.exp(2j * np.pi * np.random.rand(num_channels))

    # Combine path loss, shadowing, and fading  log(10^(-shadowing/10)=e^(-shadowing / 10) 正好就是对数正态分布
    channel_coefficients = fading * np.sqrt(path_loss_linear) * 10 ** (-shadowing / 10)
    # Print the channel coefficients
    print(channel_coefficients)

注意几个点:

  • 对数正态分布:如果x服从对数正态分布,则lnx服从正态分布;如果x服从正态分布,则e^x服从对数正态分布。
  • 影衰落服从对数正态分布;则以dB表示的阴影衰落服从正态分布。以dB表示的阴影衰落通常取均值为0,方差为5-12dB的正态分布。所以上述代码有点问题,不需要exp.

ChatGPT答案:

import numpy as np

def generate_rayleigh_channel(num_samples):
    # 生成实部和虚部,均为高斯分布 N(0, 1/2)
    real_part = np.random.normal(0, np.sqrt(0.5), num_samples)
    imag_part = np.random.normal(0, np.sqrt(0.5), num_samples)

    # 合成复数形式的瑞利衰落系数
    h = real_part + 1j * imag_part
    return h

# 生成样本数量
num_samples = 1000

# 生成瑞利信道系数
h = generate_rayleigh_channel(num_samples)

# 打印前10个系数
print("First 10 Rayleigh channel coefficients:", h[:10])

瑞利衰落信道模型通常用于描述多径效应下的信号衰落,其中衰落系数 ( h ) 是复数,并且其幅度服从瑞利分布,相位服从均匀分布。在复高斯分布 C N ( 0 , 1 ) \mathcal{CN}(0,1) CN(0,1)的情况下,实际上是指 ( h ) 的实部和虚部分别独立地服从高斯分布 ( \mathcal{N}(0,1/2) ),因为复高斯分布的功率归一化到1。

下面是一个生成瑞利信道衰落系数 ( h ) 的 Python 代码示例,其中 ( h ) 的实部和虚部均服从标准高斯分布(均值为0,方差为1):

def generate_rayleigh_channels(num_channels):   
# 生成实部和虚部   
	real_parts = np.random.normal(0, 1/np.sqrt(2), num_channels)   
	imag_parts = np.random.normal(0, 1/np.sqrt(2), num_channels)   
	# 合成复数衰落系数数组   
	h = real_parts + 1j * imag_parts   
	return h 
# 生成多个瑞利信道衰落系数
num_channels = 10
h_array = generate_rayleigh_channels(num_channels)
print("Generated Rayleigh channel fading coefficients:", h_array)

注意,由于我们希望 ( h ) 的功率归一化为1,即 ( ∣ h ∣ 2 |h|^2 h2 ) 的期望值为1,因此我们使用标准差为 ( 1 / 2 1/\sqrt{2} 1/2 ) 的高斯分布来生成实部和虚部。这是因为复数 ( h ) 的功率是实部和虚部平方和的一半,即 ( ∣ h ∣ 2 = ( r e a l _ p a r t 2 + i m a g _ p a r t 2 ) / 2 |h|^2 = (real\_part^2 + imag\_part^2)/2 h2=(real_part2+imag_part2)/2 ),所以需要将方差设置为 ( 1/2 ),而标准差为 ( 1 / 2 1/\sqrt{2} 1/2 )。

### 瑞利信道下的OFDM仿真 瑞利信道是一种常见的无线通信信道模型,适用于描述无直射路径或多径环境下的信号传播特性。在OFDM系统中,瑞利信道的影响可以通过引入多径效应和衰落来模拟实际的无线传输场景。 以下是基于MATLAB和Python实现瑞利信道下OFDM仿真的方法: #### MATLAB 实现 下面是一个简单的MATLAB代码示例,展示如何在瑞利信道环境下进行OFDM仿真[^1]: ```matlab % 参数设置 N = 64; % OFDM子载波数量 K = N/2; % 数据子载波数量 CP = N/4; % 循环前缀长度 P = 10; % 导频数目 beta = randn(1, P); % 导频值 (BPSK) idx_data = [1:N]; idx_pilot = [4:floor(N/P):N]; H_channel = rayleighchan(); % 创建瑞利信道对象 % IFFT 输入向量初始化 ofdm_in = zeros(1, N); data_bits = round(rand(1, K)); % 随机生成数据比特 QAM_Symbols = 2*data_bits - 1; % BPSK调制 % 插入导频和数据符号 pilot_symbols = beta; ofdm_in(idx_data(1:K)) = QAM_Symbols; ofdm_in(idx_pilot) = pilot_symbols; % IDFT变换 ofdm_time = ifft(ofdm_in); % 添加循环前缀 ofdm_with_CP = [ofdm_time(end-CP+1:end), ofmd_time]; % 经过瑞利信道 tx_signal = filter(H_channel, ofdm_with_CP); % 接收端操作(省略部分细节) rx_signal = tx_signal; % 假设没有额外噪声 ``` 上述代码展示了基本的OFDM帧结构设计以及通过瑞利信道传递的过程。 --- #### Python 实现 对于Python用户,可以利用`numpy`库完成类似的仿真过程。以下是一个简单示例: ```python import numpy as np # 参数定义 N = 64 # 子载波数 K = int(N / 2) # 数据子载波数 CP = int(N / 4) # 循环前缀长度 P = 10 # 导频数 beta = np.random.randn(P) # 导频值 (BPSK) # 初始化IFFT输入向量 ofdm_in = np.zeros(N, dtype=complex) data_bits = np.round(np.random.rand(K)).astype(int) # 随机生成数据比特 QAM_Symbols = 2 * data_bits - 1 # BPSK 调制 # 设置导频索引和数据索引 pilot_indices = np.arange(4, N, int(N / P)) data_indices = np.delete(np.arange(N), pilot_indices)[:K] # 插入导频和数据符号 ofdm_in[pilot_indices] = beta[:len(pilot_indices)] ofdm_in[data_indices] = QAM_Symbols # IDFT 变换 ofdm_time = np.fft.ifft(ofdm_in) # 添加循环前缀 ofdm_with_CP = np.concatenate([ofdm_time[-CP:], ofdm_time]) # 瑞利信道建模 rayleigh_channel = np.sqrt(1/2) * (np.random.normal(size=N + CP) + 1j * np.random.normal(size=N + CP)) # 应用瑞利信道 received_ofdm = ofdm_with_CP * rayleigh_channel print(received_ofdm.shape) ``` 此代码实现了OFDM信号的生成、循环前缀添加以及经过瑞利信道后的接收信号处理[^3]。 --- #### 关键点解析 1. **瑞利信道建模**: 在MATLAB中使用内置函数 `rayleighchan()` 来创建瑞利信道对象;而在Python中,则通过复高斯分布随机变量构建瑞利信道响应。 2. **循环前缀(Cyclic Prefix)**: 它的作用是消除ISI(符号间干扰),并使信道变为循环卷积形式以便于均衡器的设计。 3. **导频插入**: 导频用于信道估计,在接收端恢复原始发送信号时起到重要作用[^4]。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值