プログラム例
printf("文字列", 変数1, 変数2, ...);
sprintf("文字列", 変数1, 変数2, ...);
C言語のsprintf, printfと同様の動作をする。
以下3つの信号を3種類のプログラムで試験してみる
file名 | q1-1 | q1-2 | q1-3 | ||
原音との差 | 無歪 | ノイズ追加 | 歪追加 | ||
program種類 | 計算方法 | ||||
program1 | 完全一致 | 成功 | 失敗 | 失敗 | |
program2 | 誤差最小 | 成功 | 成功 | 失敗 | |
program3 | スペクトル比較 | 成功 | 成功 | 成功 |
Program1 (波形一致) |
|
結果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 (差が最小) |
|
結果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 |