小编use*_*478的帖子

加速numpy嵌套循环

我正在使用numpy和cython为python中的无线网络编写模拟,其中假设no_nodes在2d平面上随机散布了许多节点,这些节点发送一些波形及其各自的接收器,再次在2d平面上随机散射.每个发送节点产生一个I调用的波形output(每个波形可以产生不同长度的输出).

我想要做的是将每个节点的输出相加到一个大波形,这个波形将成为每个接收器的输入以进行解调等.现在有两个关键点:

  • 发送器异步发送,因此每个发送节点必须维护a 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倍更好但不多).我在想,如果有什么事我可以诉诸这样才能得到一个速度,因为它是一个真正的瓶颈整个模拟(它需要计算几乎一样多时间的代码的其余部分,这实际上是相当比这更复杂).

python for-loop numpy slice

4
推荐指数
1
解决办法
363
查看次数

numpy 中信号的 PSD 以及如何缩放它

我正在尝试计算并绘制随机信号的功率谱密度(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中情况又如何呢?

python signal-processing numpy fft scale

3
推荐指数
1
解决办法
2万
查看次数

标签 统计

numpy ×2

python ×2

fft ×1

for-loop ×1

scale ×1

signal-processing ×1

slice ×1