Matlab音频文件处理

Priliminary:

  1. SNR ( signal noise ratio):
    信噪比,单位dB,计算方式:

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]

Matlab音频文件处理_第1张图片Matlab音频文件处理_第2张图片2. 声音强度的测量单位
可参考:http://www.sqhearing.com/tlkp/981.html

  1. dB HL(Hearing Level):

听力级,是将18-25岁的正常人的听阈曲线“拉直”,作为纯音测听的基准数值,患者与正常人在各频率上的听阈之差,就表达为纯音听力图上的听力级。可表示信号强度,也可直接运用于描述听力损失程度。

  1. dB SPL(Sound Pressure Level):

声压级:它是基于物理学的基本概念,基准声压值为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。

  1. dB nHL(normal hearing level)

正常听力级:对于除纯音之外的其他刺激声,尚缺乏国际统一的听力零级标准,于是用生物校准方法,先测试出一组听力正常的年轻人对某类刺激声的听阈(以声压级表示),并将其视为该刺激声的正常听力级的“零级”,即0dB nHL。这是临床上普遍使用的一种方法。

  1. dB SL(sensation level)

感觉级:指高于听阈的dB数,基准量为该频率的信号听阈,常用于听觉诱发电位刺激信号强度的确定。

例如刺激个体单耳(左耳),如果其主观听阈为30 dB SPL,此时给刺激声为90 dB SPL的声刺激,左耳感受声音强度的大小为60 dB SL。即声刺激强度可转换成(90-30)dB SPL=60 dB SL。

  1. dB A

A计权声压级:用A计权测出噪声级为45 dB,那么,就称“A”声级是45 dB”或者写作45 dB(A)。临床听力学常采用A计权测量来评估测试环境噪音等。

  1. dB speech HL
    言语听力级:用于言语测试。

  2. dB eHL

预估听力级:用于解决由客观测试反应阈估算纯音听阈的结果表述问题。使用dB eHL表述的结果表示该阈值由客观测听估算而来,同时其数值可以在听觉干预中等同于dB HL。

  1. dB peSPL

峰等效声压级:是专门用于时程短的声音强度标定单位,为短时程音在压力变化峰处之强度(即最大压力点)与纯音峰至峰相等振幅之纯音声压级,即在示波器上比较短音电脉冲峰振幅和纯音信号的振幅关系而得出。

Matlab处理音频:

1. 读取音频文件:audioread

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

2. 写为音频文件:audiowrite

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

3.读写音频文件,并对音频文件做预处理

3.1 文件截取

3.2 归一化

3.3 文件拼接

3.4 修改文件采样率

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

你可能感兴趣的:(MATLAB,Ubuntu)