• ベストアンサー

CORDICによるSIN/COSの計算

題目のアルゴリズムの計算をプログラムしましたが、期待値と 計算値が合いません。 誤りを指摘してください。 REM calculation of sin and cos by CORDIC k = 1 / .60725 z = .65 GOSUB 1000 PRINT "cos(z)="; x PRINT "sin(z)="; y END 1000 REM sin(z) , cos(z) x = 1 / k y = 0 i = 0 1010 IF z >= 0 THEN 1200 u = x + y * 2 ^ (-i) y = y - x * 2 ^ (-i) z = z + atan(2 ^ (-i)) x = u GOTO 1400 1200 u = x - y * 2 ^ (-i) y = y + x * 2 ^ (-i) z = z - atan(2 ^ (-i)) x = u 1400 i = i + 1 IF i < n THEN 1010 RETURN アルゴリズムの出展は ディジタル信号による通信システム設計 P138 図3-36 CQ出版社

noname#91216
noname#91216

みんなが選んだベストアンサー

  • ベストアンサー
  • f272
  • ベストアンサー率46% (8008/17113)
回答No.1

nが定義されていません。 nは反復回数でしょう。

noname#91216
質問者

お礼

ありがとうございます。 確かにnの初期値が未定義です。 ただ、nの値はどうやって決めるか・・・ 困ったなぁ・・・orz 値はn>10くらいで収束するようなので、答えがあっているか 明日検算してみます。

noname#91216
質問者

補足

n=10で計算して見ると 期待値 cos(0.65)=0.79608 sin(0.65)=0.60518 計算値 cos(z)=-.1697108 sin(z)= .9854883 計算値が期待値と合わず、アルゴリズムの誤り?かどうか 検討要になってしまいました。

その他の回答 (1)

  • f272
  • ベストアンサー率46% (8008/17113)
回答No.2

おかしいですね。同じアルゴリズムでn=10としたら x=0.795994263186743 y=0.605295130438878 と計算されますよ。(エクセルVBAを使ってみました。)

関連するQ&A

  • 複素関数cos(z)の微分について

    w=u+iv=cos(z)とおいたときに,wがzの全域でコーシー・リーマン方程式(∂u/∂x=∂v/∂y,∂u/∂y=-∂v/∂x)を満たすことを示し,微分係数を求めよ.(z=x+iy,iは虚数単位) と言う問題です. 解答を見てみると,  cos(z)=cos(x)cosh(y)-isin(x)sinh(y) の加法定理の関係式を使い,  u=cos(x)cosh(y)  v=-sin(x)sinh(y) したがって,  ・∂u/∂x=-sin(x)cosh(y)  ・∂u/∂y=cos(x)sinh(y)・・・I  ・∂v/∂x=-cos(x)sinh(y)  ・∂v/∂y=-sin(x)cosh(y)・・・II よって,コーシー・リーマン方程式を満たしている. となっていました. 疑問なのは,複素関数cos(z)の微分について調べているのに,IとIIでそれぞれcosh(y),sinh(y)の微分をしていることです.  cosh(y)=cos(iy),isinh(y)=sin(iy) なので,これも複素関数の微分となり,ここでは使ってはいけないのではないのでしょうか? ほかの方法があれば教えてください.また,  {cosh(y)}'=sinh(y),{sinh(y)}'=cosh(y) となる理由もよろしくお願いします.

  • x=cosθ-sinθ y=cosθsinθの積分

    x=cosθ-sinθ y=cosθsinθ 面積の計算のしかたをおしえてください!

  • 球面座標表示での計算

    x=rsinθcosφ y=rsinθsinφ z=rcosθ と置いたとき以下のように計算するのですが θの部分微分のところで なぜrが分母にくるのかわかりません。 初歩的な計算だと思います。 どなたか、ご指摘くださる方よろしくお願いします。 ∂/∂x=∂/∂r・∂r/∂x+∂/∂θ・∂θ/∂x+∂/∂φ・∂φ/∂x ∂/∂y=∂/∂r・∂r/∂y+∂/∂θ・∂θ/∂y+∂/∂φ・∂φ/∂y ∂/∂z=∂/∂r・∂r/∂z+∂/∂θ・∂θ/∂z+∂/∂φ・∂φ/∂z r^2=x^2+y^2+z^2 tanφ=y/x tan^2θ=(x^2+y^2)/z^2 から ∂r/∂x=sinθcosφ ∂r/∂y=sinθsinφ ∂r/∂z=cosθ ∂θ/∂x=cosθcosφ/r    ←ここ  ∂θ/∂y=cosθsinφ/r    ←ここ ∂θ/∂z=-sinθ/r       ←ここ ∂φ/∂x=-sinφ/rsinθ ∂φ/∂y=cosφ/rsinθ ∂φ/∂z=0 等が求まる。 ∂/∂x=sinθcosφ∂/∂r+(cosθcosφ/r)∂/∂θー(sinφ/rsinθ)∂/∂φ ∂/∂y=sinθcosφ∂/∂r+(cosθsinφ/r)∂/∂θ+(cosφ/rsinθ)∂/∂φ ∂/∂z=cosθ∂/∂rー(sinθ/r)∂/∂θ これを ∇=i∂/∂x+j∂/∂y+k∂/∂z に代入して求めます。 つぎの式も丹念に計算していくと ∇^2=∂^2/∂r^2+(2/r)∂/∂r      +(1/r^2sinθ)∂(sinθ∂/∂θ)/∂θ      +(1/rsinθ)^2・∂^2/∂φ^2 注意深く計算して行って下さい。途中間違えたら台無しです。

  • cosとsinについて

    X=sin2t y+1=-cos2tより X^2  +(y+1)^2=1 になるのがわかりません

  • Sin, Cosを使った証明

    Asin(x)+Bcos(x) が k*sin(x+y)でしめすことができることを証明し、またk, cos y, and sin y をAとBを使って表せという問題があるのですが、わかりません。 最初の証明の方は、k*sin(x+y)を展開して k*sin(x+y) = ksin(x)cos(y) + kcos(x)sin(y) Aをkcos(y)、Bをksin(x)とする。 つまり、Asin(x) + Bcos(x) というやりかたでやってみたんですが、k, cos y, and sin y をAとBを使って表せというのができません。 何かいい方法ありませんか?

  • y(t)=exp(-t)*sin(t)を相平面に描

    質問内容  減衰振動 y(t) = exp(-t) * sin(t) を相平面上に描いて、らせん状になることを確認したい。  50歳の数学が趣味の会社員です。  いま勉強している「技術者のための高等数学-1 常微分方程式」の第5版 (ISBN4-563-00561-4)の 131頁に載っている下記の問題が難しくてどうしても 解けません。  かれこれ 1週間ほど悩んでいます。 12.減衰振動 y(t) = exp(-t) * sin(t) を考える。対応する曲線を相平面上に 描き、この曲線がらせん状をしていることを見よ。 y(t) = exp(-t) * sin(t) から特性方程式 の解はλ = -1±i。(i = √(-1)) ゆえに特性方程式は、 (λ - (-1 + i)) * ((λ - (-1 - i)) = ((λ + 1) - i) * ((λ + 1) + i) = (λ + 1) ^ 2 - i ^ 2 = λ ^ 2 + 2 * λ + 1 + 1 = λ ^ 2 + 2 * λ + 2 特性方程式に対応する微分方程式は、 y'' + 2 * y' + 2 * y = 0(' は d/dt) … (1) v = y' = dy/dt とおくと、 y'' = v' = dv/dt = dv/dy * dy/dt = dv/dy * v ゆえに (1) は、 y'' + 2 * y' + 2 * y = v * dv/dy + 2 * v + 2 * y = 0 dv/dy + 2 + 2 * y / v = 0 … (2) u = v / y, v = u * y とおくと、dv/dy = du/dy * y + u ゆえに (2) は、 dv/dy + 2 + 2 * y / v = du/dy * y + u + 2 + 2 * y / (u * y) = du/dy * y + u + 2 + 2 / u = 0 du/dy * y = -(u + 2 + 2 / u) = -(u ^ 2 + 2 * u + 2) / u u / (u ^ 2 + 2 * u + 2) * du = -dy / y ∫(u / (u ^ 2 + 2 * u + 2))du = -∫(dy / y) + B (B は積分定数) … (3) (3) の右辺について -∫(dy / y) + B = -log|y| + B (3) の左辺について ∫(u / (u ^ 2 + 2 * u + 2))du = (1 / 2) * ∫((2 * u + 2 - 2) / (u ^ 2 + 2 * u + 2))du = (1 / 2) * ∫((2 * u + 2) / (u ^ 2 + 2 * u + 2))du - ∫(1 / (u ^ 2 + 2 * u + 2))du = (1 / 2) * log|u ^ 2 + 2 * u + 2| - ∫(1 / ((u + 1) ^ 2 + 1))du = (1 / 2) * log(u ^ 2 + 2 * u + 2) - atan(u + 1)(atan は tan の逆関数) ゆえに (3) は、 (1 / 2) * log(u ^ 2 + 2 * u + 2) - atan(u + 1) = -log|y| + B log(u ^ 2 + 2 * u + 2) - 2 * atan(u + 1) = -2 * log|y| + C(C = 2 * B) = -log(y ^ 2) +C u = v / y なので、 log(v ^ 2 / y ^ 2 + 2 * v / y + 2) - 2 * atan(v / y + 1) = -log(y ^ 2) + C log((v ^ 2 + 2 * v * y + 2 * y ^ 2) / (y ^ 2)) - 2 * atan(v / y + 1) = -log(y ^ 2) + C log(v ^ 2 + 2 * v * y + 2 * y ^ 2) - log(y ^ 2) - 2 * atan(v / y + 1) = -log(y ^ 2) + C log(v ^ 2 + 2 * v * y + 2 * y ^ 2) - 2 * atan(v / y + 1) = C … (4) ここで手詰まり。これ以上、式を簡単にできません。  ここで yv 平面を極座標に変換してみると、(4) は、 y = r * cos(θ), v = r * sin(θ) とおく log(r ^ 2 * sin(θ) ^ 2 + 2 * r ^ 2 * sin(θ) * cos(θ) + 2 * r ^ 2 * cos(θ) ^ 2) - 2 * atan((r * sin(θ)) / (r * cos(θ)) + 1 ) = C log(r ^ 2 * (sin(θ) ^ 2 + 2 * sin(θ) * cos(θ) + 2 * cos(θ))) - 2 * atan(tan(θ) + 1 ) = C log(r ^ 2 * (1 + 2 * sin(2 * θ) + cos(θ) ^ 2)) - 2 * atan(tan(θ) + 1 ) = C log(r ^ 2 * (1 + 2 * sin(2 * θ) + cos(θ) ^ 2)) = C + 2 * atan(tan(θ) + 1) r ^ 2 * (1 + 2 * sin(2 * θ) + cos(θ) ^ 2) = exp(C + 2 * atan(tan(θ) + 1)) = C * exp(atan(tan(θ) + 1))(exp(C) を Cに再定義) r ^ 2 = C / (1 + 2 * sin(2 * θ) + cos(θ) ^ 2) * exp(atan(tan(θ) + 1))  らせん状ということは、r = α * exp(β * θ) の形にならないといけないと 思うのですが、どうしてもその形に持って行けません。  減衰しない振動 y(t) = sin(t) の場合は、対応する曲線を相平面上に描くと 円になるので、減衰振動がらせん状になることは予想できます。  私がどこかで計算を誤っているのでしょうか? それとも、そもそも解き方が 根本的に誤っているのでしょうか ?  最終学歴は工業高校卒業で大学には行っていません。  45歳から数学を独学で勉強していて、周りには質問に答えてくれる人はいません。勉強している本にも答えは載っていません。  ご教示いただければ幸いです。

  • SINとCOSのフーリエ変換(というか位相差の出し方)

    SINの各角度ごとの値:S(K) (K=1~360) COSの各角度ごとの値:C(K) (K=1~360) 周波数とサンプリング時間とデータの数をf、ts、 X(K)=S(K)*COS(2π*K/360)  Y(K)=S(K)*SIN(2π*K/360) Σ(K=1~360)X(K)=X Σ(K=1~360)Y(K)=Y ATAN(Y/X)=SIN関数の位相 になると今、思っています そしてS(K)の所をC(K)に変えればCOS関数の位相が出ると思っています。 そして二つの関数の位相差は90度のはずですが 二つとも-90度ぐらいで位相差はほぼ0になってしまいます。どこが違うのでしょうか?

  • sin cos tanって何ですか?

    図形に進むまでは気にならなかったんですけど 三角形を求めるときの公式で1/2×b×c×sinAで面積が求められるのしって改めて考えて sin,cos,tanってなんだろうと思いました。 今まではsinはy方向に進む、cosはx方向に進む、tanは1進んで y軸方向に進む距離だと思っていました。 分かりやすくいってsin cos tanって何ですか?回答お願いします。 

  • 不定積分∫(sin x)^(-4)(cos x)^(-2)dxの計算

    「解析学序説」上(一松信)p77の不定積分∫(sin x)^(-4)(cos x)^(-2)dxに挑戦してみました。I(m,n)=∫(sin x)^m(cos x)^ndxの漸化式を何回か使うと結果が出るのですが、私の出した式と巻末解答とがあまりに違いすぎるのです。 (1)  I(-4,-2)=1/(((sin x)^3)cos x) - 4cos x/3(sin x)^3 - 8cos x/3sin x (私が出した解答、または通分すると(2)になります) (2)  (3 - 12(cos x)^2 + 8(cos x)^4)/(3(sin x)^3)cos x ところが、巻末解答は次のようです。 (3)  -1/(3((sin x)^3)cos x) - (8/3)cot 2x   * 巻末解答には、8/3(正)と3/8(誤)の誤植があります。 (2)と(3)とはかなり違った形をしていますが、(3)を2倍角の公式を使って計算していくと(2)になりますので、一件落着というわけですが、どうも気にかかることがあります。 ## I(m,n)=∫(sin x)^m(cos x)^ndxの漸化式を使うとまず、(1)に到達するのではないでしょうか。すると(1)から(2)を出すのは簡単としても、(2)から同値変形をしていって(3)に達するのはかなり大変な作業ではないかと思われるのになぜ、(1)または(2)で止めなかったのか不思議です。 なお、岩波全書の「数学公式1」 P183も丸善の「数学大公式集」(大槻義彦 訳、1983年)P139も I(-4,-2)を上の(3)で与えてあります。わざわざcot2xにする必要はあるのでしょうか? 何か全く別の観点からの算出という感じがしてならないのですが、思い過ぎでしょうか? ご指導、よろしくお願いいたします。

  • サインカーブを計算したい

    サインカーブ(正弦波)の計算をしたいと思います やりたいことは以下のとおりです  イ.0~255段階の振幅がある  ロ.1振幅の時間軸を調整できるようにし、その数値にあわせて1回の振幅をする  ハ.たとえば、127に設定すると、127カウントで一回の振幅がある  ニ.たとえば、127に設定した場合、0から127の任意の場所の振幅のレベルを取り込みたい 補足 1カウントあたりの時間軸は固定です 1振幅の時間軸を127に設定している場合、0~127の数値を順に読み取りながら出力すれば1振幅し、これを繰り返し行うことで正弦波となる 時間軸をたとえば255に設定すると、周波数は2倍になる 分かりにくいと思いますが、これをC言語で計算しようとすると、どういうプログラムになるのでしょうか? 1振幅の時間軸をX、取り出したい時間軸の位置をYとしてお願いします 以下のプログラムで正弦波になると思います int i = 0;  //カウンター用 z = 128; //1振幅の時間軸(127) main() {  while(1)  {   print get(z, i);   i++;   if (i == z) i = 0;  } } void get(int x, int y) {  (計算式) } 私の頭では計算できません どうか、お力をお貸しください