"""
Spyder Editor
This is a temporary script file.
"""
import wave
import matplotlib.pyplot as plt
import numpy as np
import os
import librosa
import math
global filepath
f1 = wave.open("C:/Users/daicong/Desktop/主程序/评估/nsec/sounds/ref.wav",'rb')
params1 = f1.getparams()
nchannels1, sampwidth1, framerate1, nframes1 = params1[:4]
strData1 = f1.readframes(nframes1)
waveData1 = np.frombuffer(strData1,dtype=np.int16)
ref = waveData1*1.0/(max(abs(waveData1)))
def comp_SNR(origianl_waveform, target_waveform):
snr = 10 * np.log10(np.sum(origianl_waveform ** 2) / np.sum((origianl_waveform - target_waveform) ** 2))
return snr
def comp_PSNR(target, masked):
MSE = np.mean((target - masked) ** 2)
MAX = np.max(target)
return 20 * np.log10(MAX / np.sqrt(MSE))
def comp_LSD(target, masked):
original_spectrogram = librosa.core.stft(target, n_fft=2048)
target_spectrogram = librosa.core.stft(masked, n_fft=2048)
original_log = np.log10(np.abs(original_spectrogram) ** 2)
target_log = np.log10(np.abs(target_spectrogram) ** 2)
original_target_squared = (original_log - target_log) ** 2
target_lsd = np.mean(np.sqrt(np.mean(original_target_squared, axis=0)))
return target_lsd
SNR_result = {}
LSD_result = {}
PSNR_result = {}
SegSNR_result = {}
wavefiles = os.listdir("C:/Users/daicong/Desktop/主程序/评估/nsec/sounds")
for i in wavefiles:
wavedata = wave.open("C:/Users/daicong/Desktop/主程序/评估/nsec/sounds/%s"%i,'rb')
strData = wavedata.readframes((wavedata.getparams())[3])
waveData = np.frombuffer(strData,dtype=np.int16)
waveData = waveData*1.0/(max(abs(waveData)))
SNR = comp_SNR(ref,waveData)
LSD = comp_LSD(ref,waveData)
PSNR = comp_PSNR(ref,waveData)
SNR_result[i] = SNR
LSD_result[i] = LSD
PSNR_result[i] = PSNR
import numpy as np
import wave
import os
import librosa
global filepath
filepath = "C:/Users/daicong/Documents/SNR/data/"
dirname= os.listdir(filepath)
print(dirname)
def wavread(i):
filepath = "C:/Users/daicong/Documents/SNR/data/"
dirname= os.listdir(filepath)
f = wave.open(filepath+dirname[i],'rb')
params = f.getparams()
nchannels, sampwidth, framerate, nframes = params[:4]
strData = f.readframes(nframes)
waveData = np.fromstring(strData,dtype=np.int16)
f.close()
waveData = waveData*1.0/(max(abs(waveData)))
return waveData
def numpy_SNR(origianl_waveform, target_waveform):
signal = np.sum(origianl_waveform ** 2)
noise = np.sum((origianl_waveform - target_waveform) ** 2)
snr = 10 * np.log10(signal / noise)
return snr
def wav_snr(ref_wav, in_wav):
if (abs(in_wav.shape[0] - ref_wav.shape[0]) > 10):
pad_width = ref_wav.shape[0] - in_wav.shape[0]
in_wav = np.pad(in_wav, (0, pad_width), 'constant')
else:
print("错误:参考wav与输入wav的长度明显不同")
return -1
norm_diff = np.square(np.linalg.norm(in_wav - ref_wav))
if (norm_diff == 0):
print("错误:参考wav与输入wav相同")
return -1
ref_norm = np.square(np.linalg.norm(ref_wav))
snr = 10 * np.log10(ref_norm / norm_diff)
return snr
def psnr(ref_wav, in_wav):
MSE = np.mean((ref_wav - in_wav) ** 2)
MAX = np.max(ref_wav)
return 20 * np.log10(MAX / np.sqrt(MSE))
def numpy_LSD(origianl_waveform, target_waveform):
""" 长度不一样首先补0上去,保证形状一样 """
pad_width = origianl_waveform.shape[0] - target_waveform.shape[0]
target_waveform = np.pad(target_waveform, (0, pad_width), 'constant')
""" 比较原始和目标音频之间的对数谱距离(LSD),也称为对数谱失真,
是两个频谱之间的距离测量值(以dB表示) """
print("数据形状为", origianl_waveform.shape)
print("数据类型为", type(origianl_waveform))
original_spectrogram = librosa.core.stft(origianl_waveform, n_fft=2048)
target_spectrogram = librosa.core.stft(target_waveform, n_fft=2048)
original_log = np.log10(np.abs(original_spectrogram) ** 2)
target_log = np.log10(np.abs(target_spectrogram) ** 2)
original_target_squared = (original_log - target_log) ** 2
target_lsd = np.mean(np.sqrt(np.mean(original_target_squared, axis=0)))
return target_lsd
filepath = "C:/Users/daicong/Documents/SNR/data/"
dirname= os.listdir(filepath)
for i in range(len(dirname)):
f = wave.open(filepath+dirname[i],'rb')
params = f.getparams()
print(dirname[i])
print(params)