106

Python でシミュレートしている 100 個のビン信号にランダム ノイズを追加して、より現実的なものにしたいと考えています。

基本的なレベルでは、最初に考えたのは、ビンごとに行き、特定の範囲の間で乱数を生成し、これを信号から加算または減算することでした。

私は(これはpythonであるため)numpyなどを介してこれを行うためのよりインテリジェントな方法があることを望んでいました。(理想的には、ガウス分布から引き出され、各ビンに追加される数値も優れていると思います。)

事前に返信ありがとうございます。


私は自分のコードを計画している段階にあるので、表示するものは何もありません。ノイズを生成するもっと洗練された方法があるのではないかと考えていました。

出力に関しては、次の値を持つ 10 個のビンがあるとします。

ビン 1: 1 ビン 2: 4 ビン 3: 9 ビン 4: 16 ビン 5: 25 ビン 6: 25 ビン 7: 16 ビン 8: 9 ビン 9: 4 ビン 10: 1

ノイズを追加して次のようなものを与えることができる事前定義された関数があるかどうか疑問に思いました:

ビン 1: 1.13 ビン 2: 4.21 ビン 3: 8.79 ビン 4: 16.08 ビン 5: 24.97 ビン 6: 25.14 ビン 7: 16.22 ビン 8: 8.90 ビン 9: 4.02 ビン 10: 0.91

そうでない場合は、ビンごとに行って、ガウス分布から選択した数値をそれぞれに追加します。

ありがとうございました。


実際にシミュレートしているのは、電波望遠鏡からの信号です。シミュレーションの信号対雑音比を最終的に選択できるようにしたいと考えています。

4

8 に答える 8

146

ノイズ配列を生成して、信号に追加できます

import numpy as np

noise = np.random.normal(0,1,100)

# 0 is the mean of the normal distribution you are choosing from
# 1 is the standard deviation of the normal distribution
# 100 is the number of elements you get in array noise
于 2012-12-27T17:09:36.087 に答える
74

...そして、私のように、学習曲線が非常に早い段階にある人にとっては、

import numpy as np
pure = np.linspace(-1, 1, 100)
noise = np.random.normal(0, 1, 100)
signal = pure + noise
于 2014-10-03T15:11:58.383 に答える
2

実際には、ホワイト ノイズを含む信号をシミュレートしたいと考えています。正規ガウス分布を持つランダム ポイントを信号に追加する必要があります。unit/SQRT(Hz) で指定された感度を持つデバイスについて話す場合、そこからポイントの標準偏差を考案する必要があります。ここでは、これを行う関数「white_noise」を提供します。残りのコードはデモンストレーションであり、本来の動作を確認します。

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal

"""
parameters: 
rhp - spectral noise density unit/SQRT(Hz)
sr  - sample rate
n   - no of points
mu  - mean value, optional

returns:
n points of noise signal with spectral noise density of rho
"""
def white_noise(rho, sr, n, mu=0):
    sigma = rho * np.sqrt(sr/2)
    noise = np.random.normal(mu, sigma, n)
    return noise

rho = 1 
sr = 1000
n = 1000
period = n/sr
time = np.linspace(0, period, n)
signal_pure = 100*np.sin(2*np.pi*13*time)
noise = white_noise(rho, sr, n)
signal_with_noise = signal_pure + noise

f, psd = signal.periodogram(signal_with_noise, sr)

print("Mean spectral noise density = ",np.sqrt(np.mean(psd[50:])), "arb.u/SQRT(Hz)")

plt.plot(time, signal_with_noise)
plt.plot(time, signal_pure)
plt.xlabel("time (s)")
plt.ylabel("signal (arb.u.)")
plt.show()

plt.semilogy(f[1:], np.sqrt(psd[1:]))
plt.xlabel("frequency (Hz)")
plt.ylabel("psd (arb.u./SQRT(Hz))")
#plt.axvline(13, ls="dashed", color="g")
plt.axhline(rho, ls="dashed", color="r")
plt.show()

ノイズのある信号

PSD

于 2020-07-26T10:55:20.947 に答える