Python正弦白噪声

时间:2017-02-12 20:49:11

标签: python numpy math scipy gaussian

所以我正在做的是在给定范围内创建具有正常分布的幅度和频率的正弦波。例如5V,2-10Hz。因此,我的尝试是以给定的幅度和频率获得我的功能,然后运行直到第一个转折点。从那里我计算下一个函数并添加前一个函数转折点的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)

编辑: 基本上这里是问题,在转折点后功能似乎不是正弦曲线(线看起来是线性的)我无法理解为什么或至少如何让函数最终变得更“弯曲”而不是在转折点“锐利”。

My graph

zoomed

我想也许功能改变不应该与以前的功能有太大的不同,但随后我会失去随机性。我希望它“看起来更好”,但我不知道如何实现这一点,除非我按顺序运行频率。我试图模仿作为我申请的工作的一部分给我的“whitenoise文件” - whitenoise将被发送到数模转换器并用于测试设备。显然我没有得到这个位置但是出于知识目的我想完成这个。

这是我给出的whitenoise文件的图表 - 700分钟长:

Given file

zoomed

zoomed to show curves 从最后一张照片可以看出我和给定之间的差异,我想我将试图在整个时期而不是单个转折点运行每个函数。

1 个答案:

答案 0 :(得分:1)

真正的白噪声是完全随机的,因此尝试使用某种功能模拟白噪声已经是矛盾的。

如果您拥有的文件确实应该是白噪声而不是已经过某种过滤。你当然可以在你的程序中做同样的事情:创建一些真正的随机数并使用过滤函数来获得一些&#34;平滑&#34;效果。

例如,您可以使用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