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