プログラム例

printf("文字列", 変数1, 変数2, ...);

sprintf("文字列", 変数1, 変数2, ...);

C言語のsprintf, printfと同様の動作をする。

以下3つの信号を3種類のプログラムで試験してみる

  file名   q1-1 q1-2 q1-3
  原音との差   無歪 ノイズ追加 歪追加
           
program種類 計算方法        
program1 完全一致   成功 失敗 失敗
program2 誤差最小   成功 成功 失敗
program3 スペクトル比較   成功 成功 成功

Program1 (波形一致)

// Program1 (波形一致)
stacksize(1e8);
clear;
fn1="bs9m4-cut1.wav"; // 参照信号
fn2="quiz1.wav";      // 目標信号
x=loadwave(fn1);      // 参照信号
y=loadwave(fn2);      // 目標信号
l=length(x);
pp=0;
for i=0:2400:(l-2400)
    // 0.1秒分の信号を比較
    err=sum(abs(x(i+1:i+2400)-y(1:2400)));
    if err==0 then
        pp=i;
    end
end
// 結果を印刷
printf("Program1:");
printf("参照信号=[%s],目標信号=[%s],",fn1,fn2);
printf("位置 pp=%d\n",pp);

結果1 quiz1.wav の分析は成功する

Program 1:参照信号=[bs9m4-cut1.wav],目標信号=[quiz1.wav],位置 pp=8400000

結果2 quiz1-q2.wav の分析は失敗する

Program 1:参照信号=[bs9m4-cut1.wav],目標信号=[quiz1-q2.wav],位置 pp=0

Program2 (差が最小)

// Program2 (差が最小)
clear;
stacksize(1e8);
fn1="bs9m4-cut1.wav"; // 参照信号
fn2="quiz1-q2.wav";   // 目標信号
x=loadwave(fn1);      // 参照信号
y=loadwave(fn2);      // 目標信号
l=length(x);
mm=1e9;
pp=0;
for i=0:2400:(l-2400)
    err=sum(abs(x(i+1:i+2400)-y(1:2400)));
    if err < mm then
        mm=err;
        pp=i;
    end
end
// 結果を印刷
printf("Program 2:");
printf("参照信号=[%s],目標信号=[%s],",fn1,fn2);
printf("誤差 mm = %d, 位置 pp=%d\n",mm,pp);
          
結果1 quiz1-q2.wav は成功する

Program 2:参照信号=[bs9m4-cut1.wav],目標信号=[quiz1-q2.wav],誤差 mm = 0, 位置 pp=8400000

          
結果2 quiz1-q3.wav は失敗する

Program 2:参照信号=[bs9m4-cut1.wav],目標信号=[quiz1-q3.wav],誤差 mm = 240, 位置 pp=4065600

          

 

Program3 (フーリエ変換比較)
// Program3 (フーリエ変換比較)
clear;
stacksize(1e8);
fn1="bs9m4-cut1.wav"; // 参照信号
fn2="quiz1-q3.wav";   // 目標信号
x=loadwave(fn1);      // 参照信号
y=loadwave(fn2);      // 目標信号
lx=length(x);
fy=abs(fft(y(1:128),-1))^2;
fy=fy/mean(fy);
mm=1e9;
pp=0;
for i=0:2400:(lx-128)
    fx=abs(fft(x(i+1:i+128),-1))^2;
    fx=fx/mean(fx);
    err=mean(abs(fy-fx)^0.5);
    if err < then
        mm=err;
        pp=i;
    end
end
// 結果を印刷
printf("Program 3:");
printf("参照信号=[%s],目標信号=[%s],",fn1,fn2);
printf("誤差 mm = %d, 位置 pp=%d\n",mm,pp);

          
結果1 quiz1-q2.wav は成功する

Program 3 :参照信号=[bs9m4-cut1.wav],目標信号=[quiz1-q2.wav],誤差 mm = 0, 位置 pp=8400000

          
結果2 quiz1-q3.wav は失敗する

rogram 3 :参照信号=[bs9m4-cut1.wav],目標信号=[quiz1-q3.wav],誤差 mm = 0, 位置 pp=8088000