2017-02-12 86 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