認識のやり方について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ko

認識のやり方について

#1

投稿記事 by ko » 12年前

マイコンで音声認識をやるために2かいAD変換を使って取ったデータをFFTで変換するところまでやりました。
そこからhzとパワースペクトルのデータをどうやって近いものかを認識していくプログラムを書きたいのですがどうすればいいでしょうか?
音声認識自体全くの独学なのでいまいちよく分かっていないのですがよろしくお願いします。
↓FFT関数です。

コード:

void fft1(double ar[], double ai[], int n, int iter, int flag)
{
	int i, it, j, j1, j2, k, xp, xp2;
	double arg, dr1, dr2, di1, di2, tr, ti, w, wr, wi;

	if(n < 2)
	{
		return;
	}
	if(iter <= 0)
	{
		iter = 0;
		i = n;
		while((i /= 2) != 0)	iter++;
	}
	j = 1;
	for(i = 0; i < iter; i++)	j *= 2;
	if(n != j)
	{
		return;
	}
	w = (flag? M_PI: -M_PI) / (double)n;
	xp2 = n;
	for(it = 0; it < iter; it++)
	{
		xp = xp2;
		xp2 /= 2;
		w *= 2;
		for(k = 0, i = - xp; k < xp2; i++)
		{
			wr = cos(arg = w * k++);
			wi = sin(arg);
			for(j = xp; j <= n; j += xp)
			{
				j2 = (j1 = j + i) + xp2;
				tr = (dr1 = ar[j1]) - (dr2 = ar[j2]);
				ti = (di1 = ai[j1]) - (di2 = ai[j2]);
				ar[j1] = dr1 + dr2;
				ai[j1] = di1 + di2;
				ar[j2] = tr * wr - ti * wi;
				ai[j2] = ti * wr + tr * wi;
			}
		}
	}
	j = j1 = n / 2;
	j2 = n - 1;
	for(i = 1; i < j2; i++)
	{
		if(i < j)
		{
			w = ar[i];
			ar[i] = ar[j];
			ar[j] = w;
			w = ai[i];
			ai[i] = ai[j];
			ai[j] = w; 
		}
		k = j1;
		while(k <= j)
		{
			j -= k;
			k /= 2;
		}
		j += k;
	}
	if(flag == 0)	return;
	w = 1. / (double)n;
	for(i = 0; i < n; i++)
	{
		ar[i] *= w;
		ai[i] *= w;
	}
	return;
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 認識のやり方について

#2

投稿記事 by softya(ソフト屋) » 12年前

私も詳しくありませんし、マイコンで実用レベルで動くかも分かりませんが下記のスライドは参考になりませんでしょうか。
「音声認識の基礎」

大変難しいことは分かると思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
usao
記事: 1892
登録日時: 13年前
連絡を取る:

Re: 認識のやり方について

#3

投稿記事 by usao » 12年前

私もググっただけなんですけど
http://recognition.web.fc2.com/
こことか 調べる必要がありそうな技術的単語 が何個か出てくるので参考になるのかもしれません

閉鎖

“C言語何でも質問掲示板” へ戻る