function [ scores ] = pesq( ref_wav, deg_wav )
if nargin ==0, fprintf('Usage: pesq( ref_wav, deg_wav )\n');
fprintf(' ref_wav = reference input filename\n');
fprintf(' deg_wav = degraded output filename\n\n');
fprintf('For more help, type: help pesq\n\n');
return;
elseif nargin > 2, error('%s.m: Incorrect number of input arguments.\nFor usage help type: help %s',mfilename,mfilename);
end
if ~isstr( ref_wav ), error( '%s.m: First input argumnet has to be a reference wav filename as string.\nFor usage help type: help %s',mfilename,mfilename); end;
if ~isstr( deg_wav ), error( '%s.m: Second input argumnet has to be a processed wav filename as string.\nFor usage help type: help %s',mfilename,mfilename); end;
if ~exist( ref_wav, 'file' ), error( '%s.m: Reference wav file: %s not found.',mfilename,ref_wav); end;
if ~exist( deg_wav, 'file' ), error( '%s.m: Processed wav file: %s not found.',mfilename,deg_wav); end;
[ ref_data, ref_sampling_rate ] = audioread( ref_wav );
[ deg_data, deg_sampling_rate ] = audioread( deg_wav );
if ref_sampling_rate ~= deg_sampling_rate, error( '%s.m: Sampling rate mismatch.\nThe sampling rate of the reference wav file (%i Hz) has to match sampling rate of the degraded wav file (%i Hz).',mfilename,ref_sampling_rate,deg_sampling_rate);
else, sampling_rate = ref_sampling_rate; end;
if sampling_rate==8E3, mode='narrowband';
elseif sampling_rate==16E3, mode='wideband';
else, error( '%s.m: Unsupported sampling rate (%i Hz).\nOnly sampling rates of 8000 Hz (for narrowband assessment)\nand 16000 Hz (for wideband assessment) are supported.',mfilename,sampling_rate);
end
clearvars -global Downsample DATAPADDING_MSECS SEARCHBUFFER Fs WHOLE_SIGNAL Align_Nfft Window
global Downsample DATAPADDING_MSECS SEARCHBUFFER Fs WHOLE_SIGNAL
global Align_Nfft Window
setup_global( sampling_rate );
TWOPI= 6.28318530717959;
for count = 0: Align_Nfft- 1
Window(1+ count) = 0.5 * (1.0 - cos((TWOPI * count) / Align_Nfft));
end
ref_data= ref_data(:).';
ref_data= ref_data* 32768;
ref_Nsamples= length( ref_data)+ 2* SEARCHBUFFER* Downsample;
ref_data= [zeros( 1, SEARCHBUFFER* Downsample), ref_data, ...
zeros( 1, DATAPADDING_MSECS* (Fs/ 1000)+ SEARCHBUFFER* Downsample)];
deg_data= deg_data(:).';
deg_data= deg_data* 32768;
deg_Nsamples= length( deg_data)+ 2* SEARCHBUFFER* Downsample;
deg_data= [zeros( 1, SEARCHBUFFER* Downsample), deg_data, ...
zeros( 1, DATAPADDING_MSECS* (Fs/ 1000)+ SEARCHBUFFER* Downsample)];
maxNsamples= max( ref_Nsamples, deg_Nsamples);
ref_data= fix_power_level( ref_data, ref_Nsamples, maxNsamples);
deg_data= fix_power_level( deg_data, deg_Nsamples, maxNsamples);
% KKW ---------
switch lower( mode )
case { [], '', 'nb', '+nb', 'narrowband', '+narrowband' }
standard_IRS_filter_dB= [0, -200; 50, -40; 100, -20; 125, -12; 160, -6; 200, 0;...
250, 4; 300, 6; 350, 8; 400, 10; 500, 11; 600, 12; 700, 12; 800, 12;...
1000, 12; 1300, 12; 1600, 12; 2000, 12; 2500, 12; 3000, 12; 3250, 12;...
3500, 4; 4000, -200; 5000, -200; 6300, -200; 8000, -200];
ref_data= apply_filter( ref_data, ref_Nsamples, standard_IRS_filter_dB);
deg_data= apply_filter( deg_data, deg_Nsamples, standard_IRS_filter_dB);
case { 'wb', '+wb', 'wideband', '+wideband' }
ref_data = apply_filters_WB( ref_data, ref_Nsamples );
deg_data = apply_filters_WB( deg_data, deg_Nsamples );
otherwise
error( sprintf('Mode: "%s" is unsupported.', mode) );
end
% -------------
%
% fid= fopen( 'log_mat_ref.txt', 'wt');
% fprintf( fid, '%f\n', ref_data);
% fclose( fid);
%
% fid= fopen( 'log_mat_deg.txt', 'wt');
% fprintf( fid, '%f\n', deg_data);
% fclose( fid);
% % to save time, read from data file ========
% fid= fopen( 'log_mat_ref.txt', 'rt');
% ref_data= fscanf( fid, '%f\n');
% ref_data= ref_data';
% fclose( fid);
% ref_Nsamples= length( ref_data)- DATAPADDING_MSECS* (Fs/ 1000);
%
% fid= fopen( 'log_mat_deg.txt', 'rt');
% deg_data= fscanf( fid, '%f\n');
% deg_data= deg_data';
% fclose( fid);
% deg_Nsamples= length( deg_data)- DATAPADDING_MSECS* (Fs/ 1000);
% % the above part will be commented after debugging ========
% for later use in psychoacoustical model
model_ref= ref_data;
model_deg= deg_data;
[ref_data, deg_data]= input_filter( ref_data, ref_Nsamples, deg_data, ...
deg_Nsamples);
% fid= fopen( 'log_mat_ref_tovad.txt', 'wt');
% fprintf( fid, '%f\n', ref_data);
% fclose( fid);
%
% fid= fopen( 'log_mat_deg_tovad.txt', 'wt');
% fprintf( fid, '%f\n', deg_data);
% fclose( fid);
[ref_VAD, ref_logVAD]= apply_VAD( ref_data, ref_Nsamples);
[deg_VAD, deg_logVAD]= apply_VAD( deg_data, deg_Nsamples);
% subplot( 2, 2, 1); plot( ref_VAD); title( 'ref\_VAD');
% subplot( 2, 2, 2); plot( ref_logVAD); title( 'ref\_logVAD');
%
% subplot( 2, 2, 3); plot( deg_VAD); title( 'deg\_VAD');
% subplot( 2, 2, 4); plot( deg_logVAD); title( 'deg\_logVAD');
%
% fid= fopen( 'mat_ref_vad.txt', 'wt');
% fprintf( fid, '%f\n', ref_VAD);
% fclose( fid);
%
% fid= fopen( 'mat_ref_logvad.txt', 'wt');
% fprintf( fid, '%f\n', ref_logVAD);
% fclose( fid);
%
% fid= fopen( 'mat_deg_vad.txt', 'wt');
% fprintf( fid, '%f\n', deg_VAD);
% fclose( fid);
%
% fid= fopen( 'mat_deg_logvad.txt', 'wt');
% fprintf( fid, '%f\n', deg_logVAD);
% fclose( fid);
%
crude_align (ref_logVAD, ref_Nsamples, deg_logVAD, deg_Nsamples,...
WHOLE_SIGNAL);
utterance_locate (ref_data, ref_Nsamples, ref_VAD, ref_logVAD,...
deg_data, deg_Nsamples, deg_VAD, deg_logVAD);
ref_data= model_ref;
deg_data= model_deg;
% make ref_data and deg_data equal length
if (ref_Nsamples< deg_Nsamples)
newlen= deg_Nsamples+ DATAPADDING_MSECS* (Fs/ 1000);
ref_data( newlen)= 0;
elseif (ref_Nsamples> deg_Nsamples)
newlen= ref_Nsamples+ DATAPADDING_MSECS* (Fs/ 1000);
deg_data( newlen)= 0;
end
pesq_mos= pesq_psychoacoustic_model (ref_data, ref_Nsamples, deg_data, ...
deg_Nsamples );
% KKW ---------
switch lower( mode )
case { [], '', 'nb', '+nb', 'narrowband', '+narrowband' }
% NB: P.862.1->P.800.1 (PESQ_MOS->MOS_LQO)
mos_lqo = 0.999 + ( 4.999-0.999 ) ./ ( 1+exp(-1.4945*pesq_mos+4.6607) );
scores = [ pesq_mos, mos_lqo ];
case { 'wb', '+wb', 'wideband', '+wideband' }
% WB: P.862.2->P.800.1 (PESQ_MOS->MOS_LQO)
mos_lqo = 0.999 + ( 4.999-0.999 ) ./ ( 1+exp(-1.3669*pesq_mos+3.8224) );
scores = [ mos_lqo ];
otherwise
error( sprintf('Mode: "%s" is unsupported.', mode) );
end
% -------------
%fprintf( '\tPrediction PESQ_MOS = %4.3f\n', pesq_mos );
clearvars -global Downsample DATAPADDING_MSECS SEARCHBUFFER Fs WHOLE_SIGNAL Align_Nfft Window
function align_filtered= apply_filter( data, data_Nsamples, align_filter_dB)
global Downsample DATAPADDING_MSECS SEARCHBUFFER Fs
align_filtered= data;
n= data_Nsamples- 2* SEARCHBUFFER* Downsample+ DATAPADDING_MSECS* (Fs/ 1000);
% now find the next power of 2 which is greater or equal to n
pow_of_2= 2^ (ceil( log2( n)));
[number_of_points, trivial]= size( align_filter_dB);
overallGainFilter= interp1( align_filter_dB( :, 1), align_filter_dB( :, 2), ...
1000);
x= zeros( 1, pow_of_2);
x( 1: n)= data( SEARCHBUFFER* Downsa
没有合适的资源?快使用搜索试试~ 我知道了~
matlab-基于LCMV-GSC算法的语音增加仿真-源码
共8个文件
wav:4个
m:4个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 8 浏览量
2021-09-29
19:11:22
上传
评论 1
收藏 761KB RAR 举报
温馨提示
matlab_基于LCMV_GSC算法的语音增加仿真_源码
资源推荐
资源详情
资源评论
收起资源包目录
matlab_基于LCMV_GSC算法的语音增加仿真_源码.rar (8个子文件)
matlab_基于LCMV_GSC算法的语音增加仿真_源码
wav
RTF.wav 94KB
female.wav 94KB
male.wav 94KB
male_female_pure_mixture.wav 750KB
Runme_LCMV_GSC.m 3KB
func
RTF_Kmeans.m 3KB
MWF.m 430B
pesq.m 97KB
共 8 条
- 1
资源评论
mYlEaVeiSmVp
- 粉丝: 1935
- 资源: 19万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功