2017-02-12 92 views
0

所以我正在做的是創建具有正常分佈的振幅和頻率的正弦波 - 在給定的範圍內。例如2-10Hz的5V。所以我的嘗試是用給定的幅度和頻率得到我的功能,然後運行它直到第一個轉折點。從那裏我計算下一個函數,並添加前一個函數轉折點的y值(作爲一個移位),以便從該點開始。我的問題是一些功能變化,我得到的直線,而不是曲線。如果有人能告訴我我要去哪裏,我會很感激。需要注意的是,我使用8ms增量來繪製每個值。蟒蛇正弦白噪音

import numpy as np 
import matplotlib.pyplot as plt 
import scipy.stats as stats 
import serial 

newlist = np.zeros(1) 
timesnew = np.zeros(1) 
volts = [] 

def main(amp, lowerFreq, upperFreq, time, incr): 
    #Creates graph and saves it in newlist and timesnew 
    amt = np.int(time/incr) 
    list = [] 
    timels = [] # np.zeros(amt+amt) 
    curtime = 0 
    loweramp = -amp 
    mu, sigma = 0, 1 
    ybefore = 0 
    rand = stats.truncnorm((loweramp - mu)/sigma, (amp - mu)/sigma, loc=mu, scale=sigma) 
    freqr = stats.truncnorm((lowerFreq - mu)/sigma, (upperFreq - mu)/sigma, loc=mu, scale=sigma) 
    i = 0 
    while i < amt: 
     # get amp 
     thisAmp = rand.rvs() 
     angleFreq = 2 * np.pi * freqr.rvs() 
     xtp = np.arccos(0)/angleFreq #x value of turning point 
     yval = thisAmp * np.sin(angleFreq * xtp) 

     # check that yvalue(voltage) is okay to be used - is within +-amp range 
     while not loweramp <= yval + ybefore <= amp: 
      thisAmp = rand.rvs() 
      angleFreq = 2 * np.pi * freqr.rvs() 
      xtp = np.arccos(0)/angleFreq 

      yval = thisAmp * np.sin(angleFreq * xtp) 
     # now add values to list 

     t = 0 
     while t <= xtp: 
      ynow = thisAmp * np.sin(angleFreq * t) + ybefore 
      # print ynow 
      list.append(ynow) 
      curtime += incr 
      timels.append(curtime) 
      t += incr 
      i += 1 
      print i 

     ybefore = ynow 

    newlist = np.asarray(list) 
    timesnew = np.asarray(timels) 

    #a = np.column_stack((timesnew, newlist)) 

    np.savetxt("C://foo.csv", a, delimiter=";", fmt='%.10f') 
    addvolts() 
    plt.plot(timels,list) 
    plt.show() 

if __name__ == "__main__": 
    main(5, 1, 2, 25, 0.00008) 

編輯: 基本上這裏的問題是,拐點之後的功能似乎並沒有被sinusodial(行似乎是線性的),我不明白爲什麼或者至少如何讓功能最終在轉折點處變得更「曲線」而不是「尖銳」。

My graph

zoomed

我想也許是功能的變化不應該是從以前的功能也不同,但然後我會失去隨機性。我希望它「看起來更好」,但我不知道如何實現,除非我按順序運行頻率。我試圖模擬一個作爲我申請的工作的一部分給予我的「whitenoise文件」 - 白化將被髮送到數模轉換器並用於測試設備。顯然,我沒有得到這個職位,但爲了知識的目的,我想完成這個任務。

這是我得到的白噪聲文件的圖形 - 700分鐘長:

Given file

zoomed

zoomed to show curves 從上個PIC礦和給定可以看出的區別,我想我會嘗試在整個時期內運行每個功能,而不是一個轉折點。

+0

您的問題缺乏足夠的問題描述。當刪除未定義的行時,代碼運行良好並生成一個圖。我沒有看到任何直線。這個問題因此是不可重現的。你能提供一個能夠重現問題的代碼,並且能夠描述人們有機會了解的問題嗎? – ImportanceOfBeingErnest

+0

白色噪音的定義完全不規則。試圖找到正弦變體是沒有意義的。也許是你想要構建的粉紅噪聲,白噪聲濾波到一個頻段? – LutzL

+0

@ImportanceOfBeingErnest我提供了證明和更多信息來幫助解釋我的問題。 – tauhtauhsauce

回答

1

真正的白噪聲是完全隨機的,所以試圖用某種功能模擬白噪聲已經是矛盾的了。

如果您擁有的文件實際上應該是白噪聲,而不是已經經歷了某種過濾。你當然可以在你的程序中做同樣的事情:創建一些真正的隨機數並使用過濾函數來獲得一些「平滑」效果。

例如,您可以使用Hann濾波器並使用濾波器對隨機噪聲進行colofute。如下所示。

import numpy as np 
import scipy.signal 
import matplotlib.pyplot as plt 

y = np.random.rand(1600) 
win = scipy.signal.hann(15) 
filtered = scipy.signal.convolve(y, win, mode='same')/sum(win) 

fig, (ax, ax2) = plt.subplots(nrows=2, sharex=True, sharey=True) 

ax.plot(y, linestyle="-", marker=".", lw=0.3, markersize=1, color="r", alpha=0.5) 
ax.set_title("random noise") 

ax2.plot(y, linestyle="", marker=".", color="r", markersize=1) 
ax2.plot(filtered) 
ax2.set_title("filterred") 

plt.show() 

您可能想要放大以更好地查看效果或爲過濾器窗口使用不同的參數。 enter image description here