我的任务是从 8 个谐波中形成一个音频信号(曲折),每个谐波可能有也可能没有相移(以 pi 为单位)。
#data - массив с байтами, в формате ['01010101', '11110000']
ADS = len(data) * SPP #Вычисляю размер массива под сигнал
signal = []
for i in range(ADS):
signal.append(0)
# Формируем по одному периоду сигнала на каждый байт
for b in range(len(data)):
d = 0
for N in range(1, 17, 2):
for i in range(SPP):
index = i + (b * SPP)
signal[index] += harm(N, FREQ, i, SPS, int(data[b][d]))
#s.next()
d += 1
# Функция для вычисления отдельной гармоники
def harm(N, freq, cs, sps, ph):
arg = freq*N*2*np.pi*(cs/sps)
if ph:
arg += np.pi
return AMPLITUDE*(4/np.pi)*np.sin(arg)/N
我想知道我是否可以以某种方式优化这部分代码。我考虑过使用map,但没有弄清楚如何替换i(当前样本的数量)。提前致谢!
我会尝试重写代码,根据讨论的结果进行一些优化。虽然最好的办法是在 中编写代码的“矢量”版本
Numpy,但必须考虑这一点。我会尽量优化一些小东西,好吧,写一个简单一点的代码。变化的本质是什么:harmappend为快速data[b]我们从内部循环中取出接收,现在这个itemint()相反,函数最后一个参数的计算harm是在缓存函数内部传输的您还可以尝试进行哪些进一步优化:
Numpy的np.函数math,因为对于标量,它很可能Numpy会更慢;Numpy仅对数组/向量/矩阵快速。item也从内部循环中取出更高,但这些已经是小事了,可能int(ph)您可以改为制作字典,它也会更快:该值
signal[index]可以计算为表函数:为参数的变体
harm_sum调用该函数。SPP * 256如果我们接受,SPP = 60那么我们会得到一个15360值表。内部harm_sum没有优化。对常数进行了测试
营业时间:
如果你想进一步加快代码速度,你应该放弃字符串形式的字节,将值保存在一个由字节值寻址
harm_sum的矩形表中。SPP*256PS奇怪的是函数退化成表格了。也许我犯了一个错误,尽管测试表明新旧代码被认为是相同的。