PortAudio ASIOを使う octaveで考察 その1



1. 遅延を忘れとった (-_-);

    今の場合、filterのtap数 は2000.。 すると、その半分の1000 pointまで、遅延があります。 
    line1 が、私のプログラムのsimulation。
    line2 が、通常のconvolution を simulateした ものです。

    これでは、いい音が、聞けないのは、当たり前ですね。
    octaveのプログラムは、以下のように、しました。

    %===============================================================================
    t=linspace(0,2*pi,48000);
    x_sample=2400;   
    sample=48000;
    taps=2000;
    M=x_sample + taps -1;
    ham=hamming(M);
    %================================================================================
    x=sin(1000*t)+sin(6000*t); % 1KHz & 6KHz sin wave
    x=x(1:u);                  % u pointに限定
    h=fir1(taps-1,0.2);     % fir LowPass filter coef taps=2000 cutoff=4.8KHz
    h=h';                       % 転置
    h1=[h zeros(1,u-1)];

    H=fft(h1,sample);        % filter係数をFFTしたもの

    x1=[x zeros(1,taps-1)]  % x をゼロ詰め

    for i=1:M                   % window
     x1(i)=x1(i)*ham(i);
    end

    X=fft(x1,sample);
    u=H.*X;
    Y=ifft(u);

    for i=1:M                   % 逆window
     Y(i)=Y(i)/ham(i);
    end

    Y=real(Y(1:5000));
    plot(Y);

    hold;
    plot(filter(h1,1,x));       % 通常のconvolution
    %=====================================================================================

    どうも、窓関数の掛け方が、悪いか、掛けないほうが、よいみたい ですね....

2. そこで、訂正版



上:通常のconvolution(窓掛け無し)



上:窓掛けして、遅延分を、ずらし、再度逆窓掛けしたもの

   これなら、よさそうですね。
    プログラムは、こう、なりました。 
   赤色が、修正した所です。

    t=linspace(0,2*pi,48000);
    x_sample=2400;
    sample=48000;

    taps=2000;
    M=x_sample + taps -1;
    ham=hamming(x_sample);
    ham=ham';            % 転置
    %================================================================================
    x=sin(1000*t)+sin(6000*t); % 1KHz & 6KHz sin wave
    x1=x(1:x_sample);                  % x_sample pointに限定
    h=fir1(taps-1,0.2);             % fir LowPass filter coef taps=2000 cutoff=4.8KHz
    h=h';                      % 転置
    h1=[h zeros(1,x_sample-1)];

    H=fft(h1,sample);          % filter係数をFFTしたもの
    %----次にXを計算する------------------------------------------------------------

    x1 = x1.*ham;           % window

    x2=[x1 zeros(1,taps-1)];    % x をゼロ詰め

    X=fft(x2,sample);
    u = H.*X;
    Y = ifft(u);

    Y = real(Y(1000:1000+x_sample-1));
   
    Y = Y./ham;            % inv window       
    plot(Y);

    hold;

    x3=filter(h1,1,x);       % 通常のconvolution
    %x3=x3(1000:3399);
    plot(x3);
    hold;

   入力した、1KHzと6KHzの内、6KHzは、バサッと、切れていますね。
    さて、実際は、どうなります事やら...これから試す準備です。

   それから、ホ−ムページ作成に、フリーのNVUというものを、使い始めました。
    まだ、慣れてなくて、見苦しいかも.... m(__)m

H.19.1.11 ( 20070111 )