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