• ベストアンサー

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

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C言語の質問

    Fortran言語にはsign(x,y)の関数があります、つまりxの絶対値をもち、かつyの符号をもつ値を生成する関数です。 C言語にこのような関数をも使いたいのですが、調べてみるとcopysignという関数がありました、関数の機能説明もFortaranのsignと同じとなっています。しかしながら、実際にCのソースファイルにcopysignを使うと、ビルド時に、「error C3861: 'copysign': 識別子が見つかりませんでした」のエラーが出てきました。また宣言時に「#include <math.h>も入れています。  どちら様がご存知ならば教えていただければ幸いなことです。  宜しくお願い致します!<^ ^>!!!

  • Matlabで作成したmファイルをC言語に自動変換することは可能ですか?

    大学の研究室で使っているmatlabの機能にC言語のソースを自動生成 する機能があると先生に伺ったのですが、 常識的に考えてそんな便利なことができるとは思えません。 実際に下記に示すtoolboxで自分が作ったmファイルからC言語のソースを、ある程度自動生成することは可能でしょうか? Matlab 2008 b windows-x64版 Matlab 7.7 Simulink 7.2 Image processing toolbox Signal processing toolbox Real time workshop SimulinkとReal time workshopを一度も使ったことが無いので 少し調べて良く判らない点がありました。 Realtimeworkshopでは、Simulinkで生成したブロック線図のみC言語で出 力できるものであり、mファイルからの変換はできないのでしょうか?

  • c言語 random

    c言語でrandom関数を使って乱数を生成してください

  • matlab と C++の混合

    こんばんは。matlab初心者で、分からないことがあるためこちらに参りました。 メイン関数はmatlabなのですが、その中に一部 C言語で書かれた関数を含んでおり、それをmatlabで実行させたいのですが、確かそのようなことは可能だときいたのですが、実際そうですよね?? もし、可能ならば、 今 matlabのメイン関数と C言語で書いた副オプログラムを 同じディレクトリに置いて試してみたのですが、それだけではエラーになってしまいました。matlabと C++を混合で実行させるにはどのようにしたら良いのでしょう? どなたか教えていただけると助かります。

  • C言語のライブラリで"A"を20文字生成する関数名を知りたいです。

    C言語のライブラリで"A"を20文字生成する関数名を知りたいです。 C言語やVBなどのプログラミングで良く関数やライブラリとして存在している名前を調べる良いサイトを知っている方はいらっしゃいますか?

  • C言語→MATLABへの変換で、困っています。

    学生研究でMATLABを使用しています。 光学測定系で画像を取り込み、それを解析する実験を行っています。 MATLABはプログラム内の値の変更や処理の追加できることから 大変助かっています。 そこで、もともとはC言語でやっていた3種類の処理を 一つのMファイルで行いたいと思い。 只今、C→MATLAB変換するプログラムの書き直しを行っています。 そのうち2種のプログラムは行列の計算がメインだったため何とか Mファイルに書き直すことができたのですが、 最後のひとつが難しい関数らしきものが多く、 MATLABに書き直すことができるプログラムなのかもわからない状態です。 そこで、 ・C→MATLAB変換可能なプログラムか? ・書き直すにあたってどこを部分を直せばよいのか? をアドバイスいただけないでしょうか? ↓MATLAB化したいC言語ファイル http://karispace.web.fc2.com/cmat2.c 一枚のbmp画像から4枚のdatデータを出力するプログラムです。 C言語とMATLABの三ヶ月前に勉強して、使用しており、基礎がわかる程度です。 よろしくお願いします。

  • C言語について。

    C言語プログラマとしては、スタートアップコードは・・・ ・自分が書いたプログラムを、直接動かすために必要なライブラリ ・それはコンパイル後、リンカによって追加されるライブラリこれは、 どういう意味でしょうか?分かりやすく教えていただけると幸いです。すみません。で、 以下のかぶくんまんさんの回答です。 https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11247611941 で、 C言語におけるプログラミングとは「main関数を書くこと」に他ならない。なぜ「main関数を書く」ことがC言語におけるプログラミングに他ならないのかと言えば、それは偏に「C言語のコンパイラはmain関数を呼び出すプログラムを生成するから」です。それがmain関数を求めるので結果的にmain関数がリンクされ、そしてmain関数が求めるままに他の関数もリンクされていくわけです。 で、その「main関数を呼び出すプログラム」こそが、C言語における「スタートアップコード」。 という回答で、main関数以降は、プログラマが書くのですよね?プログラマが関数をリンクさせる様なプログラムを書くということでしょうか?教えていただけると幸いです。すみません。 という所が分かりません。教えていただけると幸いです。すみません。以下のURL https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12247932542

  • 矩形波 正弦波

    1MHzの矩形波から1MHzの正弦波を生成する方法を考えているのですが良い案があれば教えてもらいたいです. 矩形波はクロックとしてデジタル回路で用いています. 生成した正弦波はAM変調回路における搬送波として用いたいです.

  • どなたか、教えていただけませんでしょうか(C言語)?

    皆様のお知恵を拝借したく思いまして 投稿させていただきました C言語についての質問なのですが (1)文字配列の引数を一度mainからプロトタイプ関数へ渡し 関数で宣言して表示。 (2)さらにその関数内で、値を変更して mainで表示する 方法を教えていただきたく思いますので、宜しくお願い致します

  • MATLABのMATファイル をC言語で取り込む

    MATLAB の MATファイル をC言語でも取り込めるようにするにはどのようにすればよいのか教えてください。 (bin とか dat への変換方法がわかりません。) よろしくお願いします。