pythonでデータにガウスノイズを加える
pythonでデータにガウスノイズを加える 1. レビューMATLABにおけるGaussノイズ 2. Pythonでnumpyを利用してデータにノイズを加える
最初にMATLABでデータにノイズを加えるのは簡単で、一言です.
しかしpythonでノイズを加えたときに小さな問題に遭遇したのも、本人の愚かさのせいだろう.
1.MATLABにおけるGaussノイズのレビュー
一般的な方法:
ここでsignalは2次元のデータ行列であるため,後続の動作はすべて行列の動作である.MATLABでの運転は全く問題ありません.
2.Pythonでnumpyを利用してデータにノイズを加える
本方法:
所与のSNRのGaussノイズを発生させる場合、以下のように使用される人が多い.
ここは実は問題があって、私は最初から気づかなかった.N(mean,std**2)に分布するノイズを生成するために,noise=std*N(0,1)+mean換言すれば,ノイズのstdおよびmeanを計算する必要がある.ノイズのstdを計算するには、信号のstdを先に計算し、SNRを利用してノイズのstdを求める必要があり、上のコードからsignal_Powerは信号のstd^2とsignalを表す.sizeの積はsignalを1つ多く乗じた.sizeの結果には問題があるに違いない.
最初にMATLABでデータにノイズを加えるのは簡単で、一言です.
% SNR
signal_noise = awgn(signal,SNR,'measured');
しかしpythonでノイズを加えたときに小さな問題に遭遇したのも、本人の愚かさのせいだろう.
1.MATLABにおけるGaussノイズのレビュー
一般的な方法:
% SNR
signal_noise = awgn(signal,SNR,'measured');
Ps=sum(sum((signal-mean(mean(signal))).^2)); %signal power
Pn=sum(sum((signal-signal_noise).^2)); %noise power
snr=10*log10(Ps/Pn); %
ここでsignalは2次元のデータ行列であるため,後続の動作はすべて行列の動作である.MATLABでの運転は全く問題ありません.
2.Pythonでnumpyを利用してデータにノイズを加える
本方法:
# SNR
SNR = 5
noise = np.random.randn(signal.shape[0],signal.shape[1]) # N(0,1)
noise = noise-np.mean(noise) # 0
signal_power = np.linalg.norm( signal )**2 / signal.size # std**2
noise_variance = signal_power/np.power(10,(SNR/10)) # std**2
noise = (np.sqrt(noise_variance) / np.std(noise) )*noise ## std**2
signal_noise = noise + signal
Ps = ( np.linalg.norm(signal - signal.mean()) )**2 #signal power
Pn = ( np.linalg.norm(signal - signal_noise ) )**2 #noise power
snr = 10*np.log10(Ps/Pn)
所与のSNRのGaussノイズを発生させる場合、以下のように使用される人が多い.
signal_power = np.linalg.norm( signal )**2
noise_variance = signal_power/np.power(10,(SNR/10))
noise = np.sqrt(noise_variance)*noise + 0
ここは実は問題があって、私は最初から気づかなかった.N(mean,std**2)に分布するノイズを生成するために,noise=std*N(0,1)+mean換言すれば,ノイズのstdおよびmeanを計算する必要がある.ノイズのstdを計算するには、信号のstdを先に計算し、SNRを利用してノイズのstdを求める必要があり、上のコードからsignal_Powerは信号のstd^2とsignalを表す.sizeの積はsignalを1つ多く乗じた.sizeの結果には問題があるに違いない.