所以我要做的是创建正弦波,在给定的范围内,具有正态分布的振幅和频率。例如5伏,2-10赫兹。所以我的尝试是得到给定振幅和频率的函数,然后运行到第一个转折点。从那里我计算下一个函数,并加上前一个函数转折点的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)编辑:基本上这就是问题所在,在转折点之后,函数似乎不是正弦的(这条线似乎是线性的),我不明白为什么或者至少如何让函数在转折点变得更“曲线”而不是“尖锐”。


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



从上一张图片可以看出我和给定函数之间的区别,我想我会尝试在整个周期内运行每个函数,而不是一个转折点。
发布于 2017-02-15 18:37:26
真正的白噪声是完全随机的,所以尝试使用某种函数来模拟白噪声已经是矛盾的。
如果你的文件真的被认为是白噪声,那就说明它已经经过了某种过滤。当然,你也可以在你的程序中做同样的事情:创建一些真正的随机数,并使用一个过滤函数来获得一些“平滑”的效果。
例如,您可以使用Hann滤波器,并将随机噪声与滤波器进行卷积。如下所示。
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()您可能希望放大以更好地查看效果,或者对过滤器窗口使用不同的参数。

https://stackoverflow.com/questions/42193070
复制相似问题