FFTによるボコーダーを作ってみた

Scilabボコーダーを作ってみました。自分の声で三角波を変調しています。

4096pt FFT, 20Hz 三角波

1024pt FFT, 2Hz 三角波、バイアスつき3Hz正弦波で変調


これで三角波の代わりにシンセサイザーの出力を変調すればいいのかな?

function yn=vocoder(xn, hn, blocksize)
  index = 1;
  zeropad = [1:blocksize] - [1:blocksize];
  w = window( 'hn', blocksize )
  eoblock = index+blocksize-1
  eodoubleblock = index+blocksize*2-1
  
  yn = xn - xn; // make yn as same figure with xn, but zero padding
  while ( eodoubleblock <= min( size(hn,2), size( xn,2 ) ) ) do
    block = [xn( index:eoblock ) .* w zeropad];  // get block
    h = [hn(index:eoblock) .* w zeropad];
    spectrum = fft( block ) .* fft(h);       // convolution
    block = ifft(spectrum);
    yn( index:eodoubleblock ) = yn( index:eodoubleblock ) + block;
    index = index + blocksize/2; // slide block window half
    eoblock = eoblock + blocksize/2;
    eodoubleblock = eodoubleblock + blocksize/2;
  end
endfunction