首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python正弦白噪声

Python正弦白噪声
EN

Stack Overflow用户
提问于 2017-02-13 04:49:11
回答 1查看 2.3K关注 0票数 0

所以我要做的是创建正弦波,在给定的范围内,具有正态分布的振幅和频率。例如5伏,2-10赫兹。所以我的尝试是得到给定振幅和频率的函数,然后运行到第一个转折点。从那里我计算下一个函数,并加上前一个函数转折点的y值(作为移位),所以它从那个点开始。我的问题是,对于一些函数更改,我得到的是直线而不是曲线。如果有人能告诉我哪里出了问题,我将不胜感激。需要注意的是,对于要绘制的每个值,我使用8ms的增量。

代码语言:javascript
复制
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)

编辑:基本上这就是问题所在,在转折点之后,函数似乎不是正弦的(这条线似乎是线性的),我不明白为什么或者至少如何让函数在转折点变得更“曲线”而不是“尖锐”。

我在想,也许函数的变化不应该与之前的函数有太大的不同,但这样我就会失去随机性。我希望它“看起来更好”,但我不确定如何实现,除非我按顺序运行频率。我正在试图模仿一个“白噪声文件”,它是我申请工作的一部分--白噪声文件将被发送到一个数模转换器,并用于测试设备。很明显,我没有得到这个职位,但出于知识的目的,我想完成这份工作。

这是我得到的白噪声文件的图表- 700分钟长:

从上一张图片可以看出我和给定函数之间的区别,我想我会尝试在整个周期内运行每个函数,而不是一个转折点。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-15 18:37:26

真正的白噪声是完全随机的,所以尝试使用某种函数来模拟白噪声已经是矛盾的。

如果你的文件真的被认为是白噪声,那就说明它已经经过了某种过滤。当然,你也可以在你的程序中做同样的事情:创建一些真正的随机数,并使用一个过滤函数来获得一些“平滑”的效果。

例如,您可以使用Hann滤波器,并将随机噪声与滤波器进行卷积。如下所示。

代码语言:javascript
复制
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()

您可能希望放大以更好地查看效果,或者对过滤器窗口使用不同的参数。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42193070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档