我正在使用numpy和cython为python中的无线网络编写模拟,其中假设no_nodes在2d平面上随机散布了许多节点,这些节点发送一些波形及其各自的接收器,再次在2d平面上随机散射.每个发送节点产生一个I调用的波形output(每个波形可以产生不同长度的输出).
我想要做的是将每个节点的输出相加到一个大波形,这个波形将成为每个接收器的输入以进行解调等.现在有两个关键点:
start_clock和a ,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
Run Code Online (Sandbox Code Playgroud)
关于上述的一些评论:
output[j, :] 是发射器j的输出波形waveforms[i,:] 是接收器i接收的波形我希望我在这里要完成的工作相当清楚.因为产生的波形非常大(大约10 ^ 6个样本),我也尝试将此代码转换为cython,但没有注意到任何特定的加速(可能是5-10倍更好但不多).我在想,如果有什么事我可以诉诸这样才能得到一个速度,因为它是一个真正的瓶颈整个模拟(它需要计算几乎一样多时间的代码的其余部分,这实际上是相当比这更复杂).
我正在尝试计算并绘制随机信号的功率谱密度(PSD)。阅读的numpy 文档np.fft.fft,它提到 if A = fft(a)thennp.abs(A)是其幅度谱,np.abs(A)**2是其功率谱。
我的问题是,它是否负责对箱数等进行必要的划分(通常必须在 Matlab 中进行)以正确缩放?
例如,如果x我的原始信号以 V(伏特)为单位,我会这样做:
X = np.fft(x)
X = np.abs(X) #is that in Volts/Hz too?
#Do I have to divide by len(X) or anything else to scale it?
P = X**2 #is that in V^2/Hz? Do i have do do anything to scale it properly?
Run Code Online (Sandbox Code Playgroud)
我相信 numpy doc 可以对此进行更详细的阐述。在Matlab中我知道你必须自己处理它,但是在numpy中情况又如何呢?