開発環境 |
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