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丸めをする。
ありがとうございました!
今、試して成功しました!!
なるほど、fmodは知りませんでした。大変勉強になります。
今回意外に重要だとわかった丸め誤差についても色々と調べてみようと思います。
とにかく、助かりました。ありがとうございます!
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
:
:
--
この回答への補足
コメントありがとうございます。
こちらのcsvの出力で問題ないのですが、どーも少し周期がずれてしまいます。
0-49行目:1
50-99行目:-1
100-149行目:1
150-199行目:-1
200-250行目:1 <- この部分からひとつずつ、ずれはじめます。
matlabでは正確に周期を刻んでくれます。
現在、丸め誤差の関数を使ったりして、無理やり矩形波を生成していることに問題があるのかなと思っていますが、このようなずれはある意味しかたないのでしょうか?C言語に関する細かい知識がないので、困っています。
No.2
- 回答日時:
> c言語で簡単に矩形波を生成する方法はありませんでしょうか?
矩形波を出力すること自体はそれほど難しくありませんが、どうしても環境に依存します。
最低限、出力ポートとタイマーの制御方法が分からないとどうしようもありませんね。ポートを直に叩くのではなく、もっと気の利いたハードウェアが使えるのであれば、なおさら環境が分からないとどうしようもありません。
この回答への補足
コメントありがとうございます。
やはり、説明が足りませんでした。
ご質問を拝見させていただく限り、どーも、矩形波という言葉だけですと、とても分かりづらい質問であることがわかりました。参考になります。
僕は、矩形波をプログラム中で使用したいと考えています。とくに外部出力は考えておりません。現在、簡単なロボット制御のシミュレーションをC言語でチェックしている最中で、矩形波を使う理由としまして、モーション生成の際に矩形波を利用したいということです。
さきほど、その矩形波プログラムを表示してありますので、チェックしていただけるととてもありがたいです。どーも、タイミングがずれてしまいます。
すみません、初心者なもので、お手数をお掛けします。
No.1
- 回答日時:
矩形波の生成って何をすればいいの?座標値の入った配列でも生成すればいいの?
グラフまで表示させたいと思うなら環境依存なので環境がわからないと誰も答えられない。
MATLABはそれ専用の環境。Cは汎用のプログラミング言語。それを忘れないように。
この回答への補足
コメントありがとうございます。
説明不足でした。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が見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
歩いた自慢大会
「めちゃくちゃ歩いたエピソード」を教えてください。 長時間でも長距離でも結構です。
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
【C言語教えてください】sin波について
C言語・C++・C#
-
C言語でのこぎり波を作る方法
C言語・C++・C#
-
C言語についてです。 アスタリスクを用いて、短形波を描きたく、for文を使えば良いかと思うのですがど
C言語・C++・C#
-
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PS4コントローラーをPCでゲーム...
-
プログラムについての質問です...
-
4Kの外部モニターに出力すると...
-
COBOLのMOVEで桁数が異なる場合
-
cout と cerrの違い
-
MMDでavi出力が出来ない
-
HOCadの本についてなんですが・...
-
【PowerPoint VBAの高速化】
-
Windows Formアプリからコンソ...
-
VBAのExecメソッドで画面を非表...
-
コンセントの電力は入力と出力...
-
エクセルで英字と数字を組み合...
-
coutで出力した文字を消去する...
-
ACCESS クエリ→フォーム...
-
ListViewの複数選択について
-
エクセルVBAにて アルファ...
-
CRC16計算について
-
makeで文字化けする。migwのmak...
-
C言語 putchar関数
-
printfとputcharの違いは
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PS4コントローラーをPCでゲーム...
-
4Kの外部モニターに出力すると...
-
MMDでavi出力が出来ない
-
プログラムについての質問です...
-
コンセントの電力は入力と出力...
-
cout と cerrの違い
-
COBOLのMOVEで桁数が異なる場合
-
VBAのExecメソッドで画面を非表...
-
アクセスでエクセルに出力する...
-
Windows Formアプリからコンソ...
-
VBAでテキスト出力時のスペース...
-
coutで出力した文字を消去する...
-
Accessのテーブルからcsv出力す...
-
スマホのバッテリー消費につい...
-
ACCESS クエリ→フォーム...
-
テキストファイルから特定の文...
-
ACCESSからExcelへエクスポート...
-
無線とかアンテナに関しの質問...
-
CRC16計算について
-
printfとputcharの違いは
おすすめ情報