信号処理 第15回講義内容


授業内容
  • 4 相関関数(教科書p.51-) 
    • 4.1 関数の類似性を測る
    • 4.2 相互相関関数
  • 実習14に取り組む
実習内容
実習15【10点】
実習14に対して,Cプログラムによってτの範囲を高次元化(τ=−36〜36)にしたときの相互相関関数値が得られるようにする.
そして,その得られた関数値を縦軸,横軸をτとした折れ線グラフをExcelで作成せよ.また,Cソースプログラムも示しなさい.

注)入力波形の与え方は,以下の相関関数プログラム例のようにmain()内でとりあえず与えて,プログラムが動作するかを確認できれば最低限OKです.ただ,今後の課題でプログラムを再利用しますので,時間があれば,外部からExcelデータで入力波形を与えられるようにしておく方が賢明です.
提出期限
9/17(木)17:00
  • プログラムソースは,e-Learningシステムに提出
  • 得られた相互相関関数のグラフとプログラムリストをA4用紙に印刷し松尾のメールボックスに提出

Excelで求めた相互相関関数のように,間引きの大きい計算では,大まかな相関の変化はつかめるが,詳細な相互相関関数値が読み取れなかった.
しかしながら,正確な相互相関関数値を求めるには,Excelでは,かなりの労力を要する.

そこで,相関関数をCプログラムによって簡単に計算させるプログラム例を示しておきます.
このプログラムを改良することで,相互相関関数値を瞬時に求めることができます.
なお,求められた相互相関関数値の出力をExcelによって,グラフ表示させる方法については,以下の手順を参考にしてください.
次に,上の処理を体験した後,今度はC言語によって2つの関数f(t)とg(t)の相関係数rを求めるプログラムを作成する.
まず,順番に以下の関数を作成していくことをお勧めする.
  • ノルムを求める関数   double nol(double *data1,int samp)
  • 内積を求める関数    double nai(double *data1,double *data2,int samp)
  • 相関係数を求める関数 double soukan(double *data1,double *data2,int samp)
これらの関数でdouble *dataは,samp次元のサンプリングデータ値です.
関数名は,各自で自由につけてもらってかまわない.
プログラム例を以下に示しておくので参考にしてもらいたい.
ただし,ノルムが0であるときの処理はしていないので気をつけること.
相関関数のプログラム例(Cプログラムはここです)
#include<stdio.h>
#include<math.h>

//ここに,#define SAMP 36 と書いて,
//関数の引数部でSAMPと書けば,別の次元でもすぐに対応できる


double nol(double *,int);

double nai(double *,double *,int);
double sokan(double *,double *,int);

main()
{
 double f[36],g[36]; //ここは,double f[SAMP],g[SAMP]となる
 int i;
 
 //2つの関数データの作成
 for(i=0;i<36;i++)
 {
  f[i] = sin((double)i / 36.0 * 3.14159); //<--f(t)
  g[i] = cos((double)i / 36.0 * 3.14159); //<--g(t)
  
  printf("%7.3lf,%7.3lf\n",f[i],g[i]);
 }
 printf("nol f,%7.4lf\n",nol(f,36));
 printf("nol g,%7.4lf\n",nol(g,36));
 printf("nai fg,%7.4lf\n",nai(f,g,36));
 printf("sokan fg,%7.4lf\n",sokan(f,g,36));
 //関数部では,printf("sokan fg,%7.4lf\n",sokan(f,g,(int)SAMP));
 //と書けばいいだろう.

}

double nol(double *f,int d) //ノルムを計算する関数
{
 double sum = 0.0;
 int i;
 
 for(i=0;i<d;i++) sum += pow(f[i],2.0);

 return(sqrt(sum));
}

double nai(double *f,double *g,int d) //内積を計算する関数
{
 double sum = 0.0;
 int i;

 for(i=0;i<d;i++) sum += f[i] * g[i];

 return(sum);
}

double sokan(double *f,double *g,int d) //相関係数を計算する関数
{
 return(nai(f,g,36) / (nol(f,36) * nol(g,36)));
}
ここでは,math.hをインクルードしているので,コンパイル時に-lmオプションをつけてください.
つまり,
cc soukan.c -lm
とすればよい.

連絡事項
  • シラバスは,毎時間持って来てください.また,自己点検の欄の記入を忘れないように.
  • 受験,就職関係で公欠するときは,メールで事前に松尾まで連絡してください.
  • 第16回(09/11)は,教室です.


〒639-1080 大和郡山市矢田町22
奈良工業高等専門学校 情報工学科 
教授  松尾 賢一
E-mail:matsuo□info.nara-k.ac.jp
(巡回ロボット対策のため,□を@に変えてください)