source_apply.m

来自「这是一个用于语音信号处理的工具箱」· M 代码 · 共 116 行

M
116
字号
%Callback function for the apply button from the 
%Source Modification window
%
%Author Karthik
%Used functions originally written by Albert Hsiao for
%creating the excitation waveforms
%Modified by D. G. Childers 2/25/98 to clean it up and remove time varying features


Lens = Lens_array(segment_no); %Lens_array=Pitch
start_point = (segment_no*Lens) - (Lens -1);
end_point = start_point + Lens-1;
if exist ('Nframe1')
   Nframe = Nframe1;
end

if file_flag == 1               % excitation1 waveform is from file
   %Read constant values from the source modification window
   if uvindicate(segment_no) == 1
      Vgain(segment_no) = eval(get(src_gain_edit,'String'));
      gm=Vgain(segment_no)-Ngain(segment_no)-Ncof(segment_no,1);
      if Vgain(segment_no)==0
         amp=0;
      else
         amp=sqrt(gm*Lens/sum(temp_excitation.^2));
      end
      excitation1(start_point:end_point) = amp.*excitation1(start_point:end_point);
   else
      excitation1(start_point:end_point) = 0;
   end
   if get(src_noise_checkbox,'Value') == 1
      Ncof1(segment_no,1) = eval(get(src_asgain_edit,'String'));
      Ncof1(segment_no,2) = eval(get(src_amp1_edit,'String'));
      Ncof1(segment_no,3) = eval(get(src_offset_edit,'String'));
      Ncof1(segment_no,4) = eval(get(src_amp2_edit,'String'));
      Ncof1(segment_no,5) = eval(get(src_dur_edit,'String'));
      Ngain1(segment_no) = eval(get(src_ngain_edit,'String'));
      % 2. calculate the noise excitation 
      Aspgain=Ncof1(segment_no,1);  % aspiration noise gain
      Amp1=Ncof1(segment_no,2);
      Offset=Ncof1(segment_no,3);
      Amp2=Ncof1(segment_no,4);
      Duration=Ncof1(segment_no,5);
      Fgain=Ngain1(segment_no);  % fricative noise gain
      noise_excitation = nspuls(Amp1,Offset,Amp2,Duration,Lens,Aspgain,Fgain);
      noise_excitation = (1/10).*noise_excitation;
   else
      noise_excitation = zeros(1,Lens);
   end
   % 3. plot the combined the excitation1 waveform (voiced+unvoiced)
   excitation1(start_point:end_point) = excitation1(start_point:end_point) + noise_excitation;
elseif file_flag == 0
   if uvindicate(segment_no) == 1  %Voiced segment
      Lcof1(segment_no,1)= 1000*eval(get(src_ee_edit,'String'));
      Lcof1(segment_no,2)= eval(get(src_tp_edit,'String'));
      Lcof1(segment_no,3)=eval(get(src_te_edit,'String'));
      Lcof1(segment_no,4)=eval(get(src_ta_edit,'String'));
      Lcof1(segment_no,5)=eval(get(src_tc_edit,'String'));
      Ee = Lcof1(segment_no,1);
      Tp = Lcof1(segment_no,2);
      Te = Lcof1(segment_no,3);
      Ta = Lcof1(segment_no,4);
      Tc = Lcof1(segment_no,5);
      Lens=eval(get(src_pp_edit,'String'));
      temp_excitation = lfpuls(Tp,Te,Ta,Tc,Ee,Lens);
      Vgain(segment_no) = eval(get(src_gain_edit,'String'));
      gm=Vgain(segment_no)-Ngain(segment_no)-Ncof(segment_no,1);
      if Vgain(segment_no)==0
         amp=0;
      else
         amp=sqrt(gm.*Lens/sum(temp_excitation.^2));
      end

      temp_excitation = amp.*temp_excitation;
   else
      temp_excitation(start_point:end_point) = 0;
   end
   if get(src_noise_checkbox,'Value') == 1
      Ncof1(segment_no,1) = eval(get(src_asgain_edit,'String'));
      Ncof1(segment_no,2) = eval(get(src_amp1_edit,'String'));
      Ncof1(segment_no,3) = eval(get(src_offset_edit,'String'));
      Ncof1(segment_no,4) = eval(get(src_amp2_edit,'String'));
      Ncof1(segment_no,5) = eval(get(src_dur_edit,'String'));
      Ngain1(segment_no) = eval(get(src_ngain_edit,'String'));
      Aspgain=Ncof1(segment_no,1);  % aspiration noise gain
      Amp1=Ncof1(segment_no,2);
      Offset=Ncof1(segment_no,3);
      Amp2=Ncof1(segment_no,4);
      Duration=Ncof1(segment_no,5);
      Fgain=Ngain1(segment_no);  % fricative noise gain
      noise_excitation = nspuls(Amp1,Offset,Amp2,Duration,Lens,Aspgain,Fgain);
      temp_noise_excitation = (1/10).*noise_excitation;
   else
      temp_noise_excitation = zeros(1,Lens);
   end
   temp_excitation = temp_excitation + temp_noise_excitation;
   
   %Time invariant section; the time varying section used to follow and was removed
      %Replicate this array to produce the excitation 
   for i = 1:Nframe
         start_point = (i*Lens) - (Lens-1);
         end_point = start_point + Lens - 1;
         excitation1(start_point:end_point) = temp_excitation;
   end
   Pitch1=Lens*ones(Nframe,1);
 
   % The time varying section used to be here
   
end
if file_flag == 0
   Lens_array = Pitch1;
end


plot_excitation;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?