2015-10-14 54 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