2017-02-12 56 views
0

私がやっているのは、正規分布振幅と周波数を持つ正弦波を作成することです。例えば5V、2〜10Hz。だから私の試みは、与えられた振幅と周波数で私の機能を取得し、それを最初の転換点まで実行することです。そこから、次の関数を計算し、前の関数の点のy値を(シフトとして)追加して、その点から開始します。私の問題は、カーブではなく直線を得る関数の変更の一部です。誰かが私がどこに間違っているのか教えてもらえれば分かります。注記すると、各値をプロットするために8ms刻みを使用します。Python正弦波のホワイトノイズ

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) 

EDIT:基本的にここ がターニングポイントの後に機能がsinusodialではないようです、問題となっている(ラインが直線的であると思われる)、私は関数を取得する方法を少なくとも理由を理解たりすることはできません転換点でより「曲がりくねった」でなく「鋭い」ではなくなる。

My graph

zoomed

私は多分、機能の変更は、前の関数からあまりにも異なることはないはずですが、その後、私はランダム性を失うことになると思っています。私はそれが "より良く見えるようにしたいが、私は順番に周波数を実行しない限り、それを達成する方法がわからない。私が適用した仕事の一部として私に与えられた「ホワイトテイズファイル」をエミュレートしようとしています。ホワイトニングはデジタル/アナログコンバータに送られ、機器のテストに使用されます。明らかに、私は知識の目的のために私がこれを完了したいという立場を得られなかった。鉱山の間に与えられたの違いを見ることができる最後のpicから

Given file

zoomed

zoomed to show curves :700分長い - ここ

は、私は与えられたホワイトノイズファイルのグラフです。私は、1つの転換点ではなく、全期間にわたって各機能を実行しようとしていると思います。

+0

あなたの質問には十分な問題の説明がありません。未定義の行を削除すると、コードは正常に実行され、プロットが生成されます。私は直線を見ません。したがって、この問題は再現性がありません。あなたは、問題を再現するコードと、人々が理解する機会がある問題の記述を提供できますか? – ImportanceOfBeingErnest

+0

定義上のホワイトノイズは完全に不規則です。正弦波の変形を見つけることは意味をなさない。おそらく、それはあなたが構成したいピンクノイズです、白いノイズは、周波数帯域にフィルタリング? – LutzL

+0

@ImportanceOfBeingErnest私は、私の問題を説明するのに役立つ証拠とさらなる情報を提供しました。 – tauhtauhsauce

答えて

1

真のホワイトノイズは完全にランダムなので、何らかの機能を使用してホワイトノイズをエミュレートしようとすると、すでに矛盾します。

あなたが持っているファイルが実際には何らかのフィルタリングを受けているよりも、ホワイトノイズであると思われる場合。あなたはもちろん、あなたのプログラムで同じことをすることができます:いくつかの "平滑化"効果を得るためにいくつかの真の乱数を作り、フィルタ関数を使います。

たとえば、Hannフィルタを使用してランダムノイズをフィルタでcolvoluteすることができます。これを以下に示します。

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

関連する問題