開発環境 Microsoft Visual C++ 2010 Express (SP1)
実行環境 Microsoft Windows XP Home Edition (SP3)
プロジェクトの種類 Win32 コンソール アプリケーション
プロジェクト名 wavelen
アプリケーションの種類 コンソール アプリケーション
追加のオプション 空のプロジェクト

wavelen.cpp
// 自己相関による波長解析
 
#define _USE_MATH_DEFINES
 
#include <stdio.h>
#include <math.h>
 
typedef unsigned char BYTE;
 
#define DATA_NUM	1000
#define WAVE_LEN	75.0
 
int main()
{
	BYTE waveformData[DATA_NUM];
 
	for (int i = 0; i < DATA_NUM; i++) {
		double t = fmod(i / WAVE_LEN, 1.0);
		double y = t < 0.5 ? t * 2 : (t - 1) * 2;
//		double y = sin(2 * M_PI * t);
		waveformData[i] = BYTE(128 + 64 * y);
	}
 
	for (int pos = 0; pos <= DATA_NUM - 200 * 2; ) {
		double r = -1;
		int waveLen;
		for (int wl = 12; wl <= 200; wl++) {
			double sum = 0;
			for (int i = 0; i < wl; i++) {
				sum +=	((waveformData[pos + i] - 128.0) / 128) *
					((waveformData[pos + wl + i] - 128.0) / 128);
			}
			sum /= wl;
			// 倍音もほぼ同値になるので基音が選ばれやすいよう何らかのバイアスが必要
//			printf("%3d %.3f\n", wl, sum);
			if (r < sum) {
				r = sum;
				waveLen = wl;
			}
		}
		printf("%d %d\n", pos, waveLen);
		pos += waveLen;
	}
	return 0;
}
 
最終更新:2013年02月04日 18:06