• ベストアンサー

C言語で矩形波生成方法

c言語で簡単に矩形波を生成する方法はありませんでしょうか? matlabではsquare()で簡単に作るのですが、これと同様な機能がある関数を作りたいと思っています。 お願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.5

あー失敬、理解しました。 ループの中であれこれ余計な計算をしているのが敗因でしょう。 極力可読性を損なわないようにループを書き換えるとこんな感じですね。 for (j = 0; j < last_time / tstep; ++j) { double re = fmod(j * tstep, T); if (re < T / 2) { output[j] = 1; } else { output[j] = -1; } } そうそう、 int max_step; max_step = rint(last_time/tstep); この行は素直に int max_step = rint(last_time/tstep); こう書いたほうが宜しいかと。尤も、rint()関数の意味を誤解しいているようなので、丸め関数についてはよく調べることをお勧めしておきます。 #rint()は所謂JIS丸めをする。

tiger2323
質問者

お礼

ありがとうございました! 今、試して成功しました!! なるほど、fmodは知りませんでした。大変勉強になります。 今回意外に重要だとわかった丸め誤差についても色々と調べてみようと思います。 とにかく、助かりました。ありがとうございます!

その他の回答 (4)

  • caceres
  • ベストアンサー率43% (61/140)
回答No.4

無意識に浮動小数点を使わない方が吉。 桁数に問題ないなら32bit Integer あるいはlongで 処理した方が安全だと思いますが。

tiger2323
質問者

お礼

コメントありがとうございます。 浮動小数点の問題は、私も少し気になっていましたが、やはり使わないほうがいいんですね。 大変勉強になります。 C言語での解析シミュレーションの難しさを思い知りました。 ありがとうございます。

回答No.3

出力されたsquare.csvを見る限り、一応できているみたいだけれど。 例えばmatlabで出力したものと比べてどこがどう気に入らないのかは、 質問者自身が示さないと誰にも判らないと思いますよ。 一応できたcsvはこんな感じ。 -- 0-49行目:1 50-99行目:-1 100-149行目:1 : : -- 例えばこうしたいのかな? -- 0行目:0 1-49行目:1 50行目:0 51-99行目:-1 100行目:0 : : --

tiger2323
質問者

補足

コメントありがとうございます。 こちらのcsvの出力で問題ないのですが、どーも少し周期がずれてしまいます。 0-49行目:1 50-99行目:-1 100-149行目:1 150-199行目:-1 200-250行目:1 <- この部分からひとつずつ、ずれはじめます。 matlabでは正確に周期を刻んでくれます。 現在、丸め誤差の関数を使ったりして、無理やり矩形波を生成していることに問題があるのかなと思っていますが、このようなずれはある意味しかたないのでしょうか?C言語に関する細かい知識がないので、困っています。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

> c言語で簡単に矩形波を生成する方法はありませんでしょうか? 矩形波を出力すること自体はそれほど難しくありませんが、どうしても環境に依存します。 最低限、出力ポートとタイマーの制御方法が分からないとどうしようもありませんね。ポートを直に叩くのではなく、もっと気の利いたハードウェアが使えるのであれば、なおさら環境が分からないとどうしようもありません。

tiger2323
質問者

補足

コメントありがとうございます。 やはり、説明が足りませんでした。 ご質問を拝見させていただく限り、どーも、矩形波という言葉だけですと、とても分かりづらい質問であることがわかりました。参考になります。 僕は、矩形波をプログラム中で使用したいと考えています。とくに外部出力は考えておりません。現在、簡単なロボット制御のシミュレーションをC言語でチェックしている最中で、矩形波を使う理由としまして、モーション生成の際に矩形波を利用したいということです。 さきほど、その矩形波プログラムを表示してありますので、チェックしていただけるととてもありがたいです。どーも、タイミングがずれてしまいます。 すみません、初心者なもので、お手数をお掛けします。

  • MASA_H
  • ベストアンサー率42% (64/151)
回答No.1

矩形波の生成って何をすればいいの?座標値の入った配列でも生成すればいいの? グラフまで表示させたいと思うなら環境依存なので環境がわからないと誰も答えられない。 MATLABはそれ専用の環境。Cは汎用のプログラミング言語。それを忘れないように。

tiger2323
質問者

補足

コメントありがとうございます。 説明不足でした。MASA_H様が言われてますように、配列に座標値が入ったものを生成したいと考えています。 現在考えている波形としまして、周期T[sec]の矩形波(出力が-1 or 1)です。また、グラフの表示などは行う予定はございません。かなり古いんですがredhatlinux7.1のgccでコンパイルしています。 ちなみに無理やり、製作したソースは以下のようになっています。 このプログラムは、周期T[sec]ごとに5秒間矩形波を生成するものです。 このプログラムを実行すると、矩形波の周期が微妙にずれてしまいます。 汚いプログラムですみません。 /*-----------------------------------------*/ #include <stdio.h> #include <math.h> #include <stdlib.h> int main(void){ /* (1) definition */ double tstep = 0.01, last_time = 5.00; int max_step; max_step = rint(last_time/tstep); double i, REtime, output[max_step], time; double T = 1.0; /* wave cycle */ int j=0, multi; /* (2) generating square wave */ // amplitude : 1 // time cycle : T = 1.0[sec] // time step : 0.01[sec] // last time : 5[sec] for (time = 0.0; time < (last_time+tstep); time = time+tstep){ i = time/T; multi = trunc(i); REtime = time - T*multi; if (REtime <= T/2.0) output[j] = 1; else output[j] = -1; j = j+1; } /* (3) file out */ int t1; FILE *f1; f1 = fopen("square.csv","w"); for(t1 = 0; t1 < 500; t1++) fprintf(f1,"%f,\n",output[t1]); fclose(f1); return 0; } /*-----------------------------------------*/