我正在编写一个Python程序,一个接一个地生成多个正弦扫描,具有不同的起始和结束频率以及不同的时间间隔。
一个例子是:
在1毫秒内从0Hz扫描到170Hz
在1毫秒内从170Hz扫描到170Hz
在1毫秒内从170Hz扫描到10Hz
因此它应该是一个斜坡上升,斜坡下降的波形。
我使用的等式受到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)
即使有10倍的频率仍然没有合并为一个波形
这是数学问题还是编程问题?
答案 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
这是情节: