DDSパラメータを求める

DDSの加算値としきい値を求める。

DDSの加算値としきい値を求める。

  • タグ:
  • タグはありません
/*
 DDSで使用する加算値としきい値を求めるプログラム

	clk_in : 入力クロック
	max : しきい値
	add : 加算値
	count : カウンタ
	clk_out : 出力クロック

	if(clk_in){
		if(count>max){
			count -= max;
			clk_out();
		}
		else{
			count += add;
		}
	}
*/

#include<stdio.h>
#include<math.h>

int main(void)
{
	const int base = 50000000; // ベースクロック
	const double goal = 1789772.5; // 生成する周波数

	int hz, count, add, max;
	int amari;

	int div = (int)(base / goal + 0.5);

	int best_add, best_max;
	double best_gosa = base;
	for(add=1; add<100; add++){

		double gosa_min;
		gosa_min = 0x7FFFFFFF;

		int hosei = -add;

		for(;;){
			max = div * add + hosei;

			hz = 0;
			count = 0;
			amari = 0;
			for(int i=0; i<base; i++){
				if(count>max){
					count -= max;
					amari += count;
					hz++;
				}
				else{
					count += add;
				}
			}

			double Hz;
			Hz = hz + (double)count / max;

			double p;
			p = Hz - goal;

			if(fabs(p) < gosa_min){
				printf("加算値 %3d しきい値 %6d 補正 %3d  誤差 %f\n", add, max, hosei, p);
				gosa_min = fabs(p);
				if(gosa_min < best_gosa){
					best_add = add;
					best_max = max;
					best_gosa = gosa_min;
					printf("更新 誤差 %f\n", gosa_min);
				}
			}
			else break;

			if(p>0){
				hosei++;
			}
			else{
				hosei--;
			}
		}
	}

	printf("加算値 %d  しきい値 %d  誤差 %f\n", best_add, best_max, best_gosa);

	return 0;
}