質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

アーキテクチャ

アーキテクチャとは、情報システム(ハードウェア、OS、アプリケーション、ネットワーク等)の設計方法、設計思想、設計思想に基づいて構築されたシステム構造をアーキテクチャと呼びます

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

Q&A

解決済

6回答

1820閲覧

16bitのプロセッサに数値計算をさせたいときに使える変数型

matsu_phy

総合スコア7

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

アーキテクチャ

アーキテクチャとは、情報システム(ハードウェア、OS、アプリケーション、ネットワーク等)の設計方法、設計思想、設計思想に基づいて構築されたシステム構造をアーキテクチャと呼びます

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

0グッド

0クリップ

投稿2018/06/10 06:46

皆さんは8,16bitのマイコンにある程度の正確さと速さを求められる数値計算をさせたいとき、どのような変数型を使っていますか?
short(16bit)やchar(8bit)などの整数型を使って計算させると、簡単にオーバーフローしてしまうと思うのですが、どうすればよいのでしょうか?

16bitマイコン(PIC24FJ64GA002)を使ってリアルタイムで高速フーリエ変換をさせたいと思い、この問題を解決するために16bitの固定小数点数(整数部7bit,小数部8bit,符号1bit)をC言語のソースコードで実装し、計算させてみたのですが、FFTの点数が512程度になってくるとやはりオーバーフローを起こしてしまいます。

固定小数点数に限界を感じたので、浮動小数点数を使いたいと思ったのですが、floatやdoubleなどの浮動小数点数は32bit以上の変数です。8bitや16bitのマイコンでも使えますが、これが最適なのでしょうか?

そこに疑問を感じて、16bitの浮動小数点数(仮数部10bit,指数部5bit,符号1bit)をソースコードで実装しようと、プログラムを作ろうと思ったのですが、私には骨の折れる作業なので、これが意味のあることなのか不安になって質問させていただきました。

今私が作ろうとしているものは、音楽用の簡易な観賞用のリアルタイムスペアナです。
よろしくおねがいします。

発生している問題・エラーメッセージ

double, floatが使えない場合に数値計算がしたいとき、どのような変数型を使えばよいのか

試したこと

ソースコードによる固定小数点数の実装。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答6

0

ベストアンサー

C言語で書かれているという事は、コンパイラを使っていると思いますが、浮動小数点用のライブラリは無いでしょうか? ただし、浮動小数点の演算をソフトでやると遅いです。リアルタイム処理に使うのは、現実的か? ... 使い方次第でしょうか。

と思って、CPU(PIC24F)の仕様を探したら、16bit x 16bitの演算もできるようですね。(当然?) とすると、C言語でも使えないでしょうか? CPU仕様を見ると、  16bit x 16bit => 32bit になるようです。
また、オーバーフローとの事ですが、16bitに入らないだけて、32bitなら、OK? それとも、更にサイズが必要なのでしょうか? 本格的な多倍長計算は大変でも桁数を限定したものなら、少し頑張れば出来ると思います。

[追記]
コンパイラの記述が無いので分かりませんが、 long(32bit) は使えませんか? 使えれば、演算結果が 32bitまでOKですね。 この手のコンパラだと、組込み演算でやってそうですが、、、。
自前で行っても 32bit x 32bit は、16bitx16bit乗算 4回と 32bitシフト(or なんか) 32bit 加算 3回でできますね。 (オーバーフロー処理とか除く)

[追記2]
質問をよく読んでませんでした。

この問題を解決するために16bitの固定小数点数(整数部7bit,小数部8bit,符号1bit)

16bitを分割するより、整数部 16bit, 小数部 16bitにされた方が、効率は良いと思います。実装がどうなっているか分かりませんが、16bit CPUならば、16bit単位で処理するのが一般には効率的です。

16bitの浮動小数点数(仮数部10bit,指数部5bit,符号1bit)

については、仮数部10bit に収まれば、価値はあるでしょうが、固定小数点の方が確実に速いと思います。 まずは、固定小数点の bit数を増やす事を検討されたら、どうでしょうか。(オーバーふーについては、事前検討を)

投稿2018/06/10 09:33

編集2018/06/11 13:58
pepperleaf

総合スコア6383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

matsu_phy

2018/06/23 07:58

回答ありがとうございます。みなさんが言うように浮動小数点数をソフトでやるのは効率が悪いようですね。固定小数点数を使ってがんばってみたいと思います。
guest

0

質問の方向性とは違う回答になりますが、音楽用スペアナなら専用ICを使って作ると楽なはずなので、どうしてもFFTで作りたいという事情がなければそっちをおすすめします。

オーディオ用7バンドスペクトラムアナライザ-用IC MSGEQ7P: 半導体 秋月電子通商 電子部品 ネット通販

このICを使った作例は検索すれば出てくるので、模倣すれば基本的には行けると思います。

データシートのブロック図を見ると、このICと同等の機能のものを自作するのもそんなに難しくはなさそうです(バンドパスフィルタのはんだ付けが骨かもしれませんが)。微妙に機能に満足できない・・・なら挑戦してみるのも楽しいかもしれません。

投稿2018/06/10 12:34

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

double、floatが使えないなら、自分で実装すればOK
それが無理と言うなら、そもそもCPUの選定ミスです


浮動小数点変数の実装、計算ライブラリの作成ってのは案外簡単ですぜ。
初心者の方のトレーニングにはちょうどいいかと。

#まあしかし、ROMのサイズ的にFFT含めて収まるのかというのはべつのおはなしw

投稿2018/06/10 12:16

編集2018/06/10 12:30
y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

あまりマイコンをC言語で使ったことはありませんが、
この状況では32bit固定小数点数が最適でしょうね。
浮動小数点数はCPUが直接処理できない場合、複数命令からなるルーチンで処理するので非常に遅いです。
浮動小数点数を使うよりは、桁数が多くても整数演算で済ませた方が早いでしょう。

16bit浮動小数点数を自作する件ですが、浮動小数点数を扱うこと自体が手間なので、ビット数が16bitでも32bitでも処理時間はほとんど変わらないと思います。
どうせ作るなら、仮数部16bitケチ表現なし・指数部+符号16bitとかにすると速いでしょう。

投稿2018/06/10 09:20

ikadzuchi

総合スコア3047

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

本題とは違うかもしれませんが、FFT使うならば実数どころか複素数計算が必要です。特段の複素数演算ライブラリを使うわけでない限り、プリミティブ型を組み合わせて複素数計算を独自定義するでしょうから、ここの部分を切り替えることで精度とかを調整できると思いますが。

投稿2018/06/10 08:44

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こんにちは。

速度を追求する場合に固定小数点を使うのは良い選択と思います。
浮動小数点は速度ではなくプログラミングの手間を省く時に良い選択です。(固定小数点でオーバーフローさせないのは無茶苦茶たいへんですから。)

浮動小数点演算機をハードウェアで持っていないCPUで高速演算したい場合は固定小数点一択と思います。
しかし、もし演算速度が要求を満たすのでされば浮動小数点を用いればプログラミングが格段に楽になります。
浮動小数点演算ライブラリを自力で作るのではなく既にあるものを使う前提です。フリーなライブラリはありそうな気がします。http://www.picfun.com/mathlib01.html

投稿2018/06/10 07:42

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問