snr = = 20lg(Vs/Vn)
where Vs is voltage of signal, Vn is voltage of noise.可推导:
Vs/Vn = 10^(db/20)
常见SNR数值及Vs/Vn比值:
snr = 0 dB, Vs/Vn = 1
snr = -3 dB, Vs/Vn = 0.7079
snr = -6 dB, Vs/Vn = 0.5012
snr = -32 dB, Vs/Vn = 0.0251
snr = -300 dB, Vs/Vn = 0
其中Vs/Vn比值可在audition中对应查看,[效果Effect] -> [振幅amplitude and Compression] -> [标准化Normalize]
2. 声音强度的测量单位
可参考:http://www.sqhearing.com/tlkp/981.html
听力级,是将18-25岁的正常人的听阈曲线“拉直”,作为纯音测听的基准数值,患者与正常人在各频率上的听阈之差,就表达为纯音听力图上的听力级。可表示信号强度,也可直接运用于描述听力损失程度。
声压级:它是基于物理学的基本概念,基准声压值为20μPa,适用于所有的声学测量。以最敏感的人耳听到的最小声强度(约20μPa)为标度的相对声压均方根值。其定义为将待测声压有效值与参考声压的比值取常用对数,再乘以20,其单位为分贝(dB)。故采用声压级表示声音强度时,则按以下公式计算:
dB SPL = 20 lg(Ps/P_ref)
其中P_ref = 20μPa(2 X 10^-5Pa), Ps为声音Pa。
20 μPa为0 dB SPL,痛阈(20 Pa)为20lg(20Pa/20μPa)= 20 x 6 = 120 dB SPL; 普通说话声(0.02 Pa)为60 dB SPL,枪炮声(2000 Pa)为160 dB SPL。
正常听力级:对于除纯音之外的其他刺激声,尚缺乏国际统一的听力零级标准,于是用生物校准方法,先测试出一组听力正常的年轻人对某类刺激声的听阈(以声压级表示),并将其视为该刺激声的正常听力级的“零级”,即0dB nHL。这是临床上普遍使用的一种方法。
感觉级:指高于听阈的dB数,基准量为该频率的信号听阈,常用于听觉诱发电位刺激信号强度的确定。
例如刺激个体单耳(左耳),如果其主观听阈为30 dB SPL,此时给刺激声为90 dB SPL的声刺激,左耳感受声音强度的大小为60 dB SL。即声刺激强度可转换成(90-30)dB SPL=60 dB SL。
A计权声压级:用A计权测出噪声级为45 dB,那么,就称“A”声级是45 dB”或者写作45 dB(A)。临床听力学常采用A计权测量来评估测试环境噪音等。
dB speech HL
言语听力级:用于言语测试。
dB eHL
预估听力级:用于解决由客观测试反应阈估算纯音听阈的结果表述问题。使用dB eHL表述的结果表示该阈值由客观测听估算而来,同时其数值可以在听觉干预中等同于dB HL。
峰等效声压级:是专门用于时程短的声音强度标定单位,为短时程音在压力变化峰处之强度(即最大压力点)与纯音峰至峰相等振幅之纯音声压级,即在示波器上比较短音电脉冲峰振幅和纯音信号的振幅关系而得出。
function readwav
% specify the folder
file_dir = '/media/me/nvme2n1/SoundPlus/KWS_Datasets/tmp/';
% filelist of all audio files
filelist_wav = dir(fullfile(file_dir,'*.wav'));
% audio read
for fileid = 1:length(filelist_wav)
filename_wav = [file_dir, filelist_wav(fileid).name]; % full name of file
% audioread: returning the sampled data in Y and the sample rate FS, in Hertz
[Y, FS] = audioread(filename_wav);
disp('read successfully');
end
end
function writewav
file_dir = '/media/me/nvme2n1/SoundPlus/KWS_Datasets/tmp/';
%% clean audio
FS = 16000; % 16k
duration = 60; % s
Y = zeros(duration * FS, 1);
filename = 'clean_audio.wav';
filename_wav = [file_dir, filename];
%% audio write
audiowrite(filename_wav, Y, FS);
disp('write successfully');
end
function preprocesswav()
file_dir = '/media/me/nvme2n1/SoundPlus/KWS_Datasets/tmp/';
%% audio clip
filename = 'clean_audio.wav';
filename_wav = [file_dir, filename];
[Y, FS] = audioread(filename_wav);
% clip
clip_start = 1;
clip_end = fix(size(Y, 1) / 2);
y_clip = Y(clip_start:clip_end);
audiowrite([filename_wav, '_clip.wav'], y_clip, FS);
disp('clip successfully');
%% audio normalization to a certain dB
% db = 20lg(Vs/Vn), where Vs is voltage of signal, Vn is voltage of noise.
% => Vs/Vn = 10^(db/20)
% when db = 0dB, Vs/Vn = 1
% when db = -32dB, Vs/Vn = 0.0251
% when db = -6dB, Vs/Vn = 0.5012
% when db = -3dB, Vs/Vn = 0.7079
filename = 'fa_test_file_20200430_34_115.wav';
filename_wav = [file_dir, filename];
[Y, FS] = audioread(filename_wav);
% normalization
rate_vs_vn = 0.707; % -3dB
max_y = max(abs(Y));
Y = Y * rate_vs_vn /max_y;
audiowrite([filename_wav, '_norm.wav'], Y, FS);
disp('normalize successfully');
%% concat
filename1 = 'fa_test_file_20200430_34_115.wav';
filename_wav1 = [file_dir, filename1];
[Y1, FS1] = audioread(filename_wav1);
filename2 = 'fa_test_file_20200430_34_115.wav_norm.wav';
filename_wav2 = [file_dir, filename2];
[Y2, FS2] = audioread(filename_wav2);
% concat
y_concat = [];
y_concat = vertcat(y_concat,Y1);
y_concat = vertcat(y_concat,Y2);
% assuming FS1 == FS2
audiowrite([file_dir, filename1, '_', filename2, '_concat.wav'], y_concat, FS1);
disp('concat successfully');
end