一个接一个地计算多个正弦扫描

时间:2015-10-14 09:05:13

标签: python audio signals sine

我正在编写一个Python程序,一个接一个地生成多个正弦扫描,具有不同的起始和结束频率以及不同的时间间隔。

一个例子是:

  1. 在1毫秒内从0Hz扫描到170Hz

  2. 在1毫秒内从170Hz扫描到170Hz

  3. 在1毫秒内从170Hz扫描到10Hz

  4. 因此它应该是一个斜坡上升,斜坡下降的波形

    我使用的等式受到this thread

    的启发
    def LinearSineSweep(self, fStart, fEnd, samplingTime, samplesPerSecond):
        nValues = int(samplesPerSecond * samplingTime)
        for i in range(0, nValues):
            delta = float(i) / nValues
            t = samplingTime * delta
            phase = 2 * math.pi * t * (fStart + (fEnd - fStart) * delta / 2)
            return self._amplitude * math.sin(phase) + self._dcOffset
    
    LinearSineSweep(0, 170, 0.001, 44100)
    LinearSineSweep(170, 170, 0.001, 44100)
    LinearSineSweep(170, 10, 0.001, 44100)
    

    但我得到的输出结果不正确: 170

    即使有10倍的频率仍然没有合并为一个波形

    1700 HZ

    这是数学问题还是编程问题?

1 个答案:

答案 0 :(得分:2)

正如@jaket在评论中指出的那样,你必须使相位在不同的段之间不断变化(我稍微解释一下)。这是代码的变体,显示了一种可以执行此操作的方法。我没有其他所有代码,因此self的第一个参数不是LinearSineSweep,而是将文本作为文本写入的文件。 (我还调整了代码,以补偿所请求的间隔通常不会是采样周期的精确倍数。)numpy matplotlib用于创建from __future__ import print_function, division import math def LinearSineSweep(f, fStart, fEnd, samplingTime, samplesPerSecond, t0=0, phi0=0): nValues = int(samplesPerSecond * samplingTime) actualSamplingTime = nValues / samplesPerSecond for i in range(0, nValues): delta = float(i) / nValues t = actualSamplingTime * delta phase = 2 * math.pi * t * (fStart + (fEnd - fStart) * delta / 2) value = math.sin(phase + phi0) # Write the time and sample value to the output... print(t0 + t, value, file=f) phase = 2 * math.pi * actualSamplingTime * (fStart + (fEnd - fStart) / 2) return t0 + actualSamplingTime, phi0 + phase if __name__ == "__main__": with open('out.csv', 'w') as f: t, phi = LinearSineSweep(f, 0, 1700, 0.001, 44100) t, phi = LinearSineSweep(f, 1700, 1700, 0.001, 44100, t, phi) t, phi = LinearSineSweep(f, 1700, 100, 0.001, 44100, t, phi) import numpy as np import matplotlib.pyplot as plt tvals, v = np.loadtxt('out.csv', unpack=True) plt.figure(figsize=(10, 4)) plt.plot(tvals, v) plt.grid() plt.show() 情节。

select t.id4id Id, n1.Name Name, group_concat(n2.name) Groups
from (select t1.actid id4id, t1.postedby id4name, t2.postedby id4groups
        from Activity t1 join Activity t2 on t1.actid = t2.parentid) t join "user" n1 on t.id4name = n1.userid join "User" n2 on t.id4groups = n2.userid
group by id4id

这是情节:

plot