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で質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) プログラムの勉強のおすすめは 7 2022/12/09 20:09
- 物理学 R直列回路の波形をオシロスコープで測定した時、写真の矩形波のような波が観測されるますがなぜこのような 2 2022/09/23 23:31
- その他(プログラミング・Web制作) プログラミングについて(Python) 添付した画像はC言語で簡単に作ったソースで、1つの配列に5つ 3 2022/09/10 19:15
- Illustrator(イラストレーター) 【シェイプ形成ツール】でうまく分割できない 1 2022/05/26 10:57
- 哲学 日本語は 言語類型として あたかも始原のごとくである 3 2022/05/29 04:41
- Excel(エクセル) エクセルのワークシートを簡単に別ファイルにする方法は? 5 2023/01/11 14:50
- 物理学 正弦波の波形率が大きくなるのは脈流効果ですか? 4 2022/08/10 11:13
- その他(Microsoft Office) 同じフォーマットのCSVファイル複数枚(行数は異なる)を1枚のエクセルファイルにしたいのですが簡単に 3 2023/01/05 16:24
- Chrome(クローム) 他人のPCブラウザに表示されているアマゾンのページのURLをタブレットで読み取りたい 5 2023/07/15 10:56
- Excel(エクセル) VLOOKUPで、検索先が3シートに分かれていて、番号の大小で検索するとエラーになります。 6 2023/07/14 19:09
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PS4コントローラーをPCでゲーム...
-
AIに回答させるって
-
KEYENCEのシーケンスプログラム...
-
cout と cerrの違い
-
プログラムについての質問です...
-
printfとputcharの違いは
-
VBAのExecメソッドで画面を非表...
-
ListViewの複数選択について
-
バッチファイル フォルダサイ...
-
printfの書式%.*s
-
C# 標準出力のencodingをutf8に...
-
Windows Formアプリからコンソ...
-
ブランキング期間
-
AviUtl 出力の失敗
-
汎用人型決戦兵器「人造人間エ...
-
ACCESS クエリ→フォーム...
-
標準出力の上書き
-
C言語の標準関数の引数の順番に...
-
CRC16計算について
-
最近の画像生成AIについて。 長...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PS4コントローラーをPCでゲーム...
-
4Kの外部モニターに出力すると...
-
コンセントの電力は入力と出力...
-
MMDでavi出力が出来ない
-
OBS配信すると、マイクが途切れ...
-
VBAでテキスト出力時のスペース...
-
cout と cerrの違い
-
COBOLのMOVEで桁数が異なる場合
-
ACCESS クエリ→フォーム...
-
アクセスでエクセルに出力する...
-
VBAのExecメソッドで画面を非表...
-
テキストファイルから特定の文...
-
Windows11対応の3入力1出力 USB...
-
VBAで有効数字の設定
-
スマホのバッテリー消費につい...
-
Excel VBAで値を変えながら、pd...
-
NTTのホームゲートウェイとOCN...
-
定格冷房能力(出力)とは 定格...
-
プログラムについての質問です...
-
PS5をMacBookProに出力したいの...
おすすめ情報