2015-10-14 58 views
0

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

一个例子是:从0Hz

  1. 扫到在1毫秒

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

  3. 扫下来到10Hz在1毫秒

所以它应该是一个斜坡上升,斜坡波形

这从来就使用由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) 

但什么I'm得到作为输出启发的公式是不正确的: 170

即使10次的频率依然没有按`吨走到一起作为一个波形

1700 HZ

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

+0

FYI:SciPy的提供功能'chirp'(http://docs.scipy.org/doc/scipy/reference/generated/scipy.signal .chirp.html),它可以做到这一点(还有更多)。 –

+0

是的,我想过这个,但啁啾返回一个数组,我的数据集太大而无法处理数组。 – AronC

+1

您需要一种将呼叫阶段从一个呼叫转移到另一个呼叫的方式。您可以在图形中看到每毫秒将相位重置为零。 – jaket

回答

2

正如@jaket在评论中指出的那样,你必须让每个细分阶段不断变化(我正在解释一下)。以下是您的代码的一个变体,显示了您可以执行此操作的一种方式。我没有所有其他代码,因此self而不是selfLinearSineSweep的第一个参数是样本以文本形式写入的文件。 (我也调整了代码以补偿请求的间隔通常不会是采样周期的精确倍数的事实)。numpymatplotlib用于创建绘图。

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() 

这里的情节:

plot

+0

就是这样,我保存了最后一个阶段,但忘了在波形的每个段之后将它们加在一起。 很好的回答! – AronC