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;
}