pythonでデータにガウスノイズを加える


pythonでデータにガウスノイズを加える
  • 1. レビューMATLABにおけるGaussノイズ
  • 2. Pythonでnumpyを利用してデータにノイズを加える

  • 最初に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の結果には問題があるに違いない.