我正在使用numpy和cython在python中编写一个无线网络模拟程序,假设有一些节点
我的目标是将每个节点的输出加总成一个大波形,作为每个接收器进行解调等操作的输入。现在有两个关键点:
no_nodes
在二维平面上随机分布,它们发送一些波形和相应的接收器,同样随机分布在二维平面上。每个发送节点产生一个我称之为output
的波形(每个节点可以产生不同长度的输出)。我的目标是将每个节点的输出加总成一个大波形,作为每个接收器进行解调等操作的输入。现在有两个关键点:
- 发射器异步发送,因此必须对每个发射器维护一个
start_clock
和一个end_clock
,以便正确地对波形求和。 j
号发送节点的输出在被i
号节点接收之前会根据函数attenuate(i,j)
进行衰减。
#create empty 2d array (no_rx_nodes x no_samples for each waveform)
waveforms = np.zeros((no_nodes, max(end_clock)))
for i in range(no_nodes): #calculate the waveform for each receiver
for j in range(no_nodes): #sum the waveforms produced by each transmitter
waveforms[i, start_clock[j]:end_clock[j]] += output[j,:] * attenuate(i,j)
return waveforms
关于上面的一些评论:
output[j, :]
是发射机 j 的输出波形waveforms[i,:]
是接收器 i 接收到的波形
我希望这很清楚,我想要达到的目标。由于产生的波形非常大(约为10^6个样本),我还尝试将此代码转换为Cython,但没有注意到任何特定的加速(可能会更快5-10倍,但不会更多)。我想知道是否还有其他可以使用的方法来获得速度提升,因为它是整个模拟的真正瓶颈(计算时间几乎与其余代码一样长,实际上比其余代码更复杂)。
attenuate = (attn_const/distances) ** attn_expon
,这将产生与 distances 相同大小的数组,对吗? - Henry Gomersall