- ベストアンサー
CPLDで平均等の数値演算
- CPLDを使用して、A/Dコンバータの取り込み結果のノイズレベルを低く抑える方法について、質問させていただきます。
- 具体的には、数十μsの周期でA/D変換を行い、連続したn個の値を平均化することでノイズ成分を収めたいと考えています。
- CPLDを使用すれば、μS以下の処理速度でこのような演算が可能なのでしょうか?ご意見をお聞かせください。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
関連するQ&A
- マイコンのDMA機能について
お世話になります。マイコンに搭載されているDMA機能についての質問です。 マイコンは具体的にはARM7TDMIのLPC2368という機種なのですが、GeneralPurposeDMAという機能がついています。 どういった事がしたいかといいますと、外部にパラレル出力型16bitA/Dコンバータを置き、このマイコンとパラレルで接続します。 そしてA/Dコンバータの変換結果をマイコン内部のメモリー(SRAM上)へ高速に8回分転送してマイコン側ではそれを平均計算して唯一の値を取り出します。 通常、マイコンの外部にA/Dコンバータをおく場合、マイコン側で変換の開始パルス生成→コンバータのBUSY待ち→取り込みといった動作をさせますが、一連の動作を高速にして複数回を取り込んで平均処理したく考えています。 いわゆるオーバーサンプリング処理といわれるようですね。 実際、オーバーサンプリングによるアナログ入力信号のホワイトノイズ除去はある程度効果が持てると考えています。 A/Dコンバータは500kSPSほどの能力を持ちますが、実際に使用している状態では20μs毎の取込となっています(50ksps)。 本来のA/Dの能力的には、10回分の変換時間となります。これをCPUが介在せずに、CPUのSRAM上へ定期的に8回分のデータが蓄積される構造にすれば、CPUはその時点から介在し、÷8をして平均値を出してくる処理をすると恐らくはより精度の良いA/D変換結果を使うことができると考えています。 DMAというのは上記のような事が可能と思ってよろしいのでしょうか? よろしくアドバイスをお願いいたします m(_ _ )m
- ベストアンサー
- その他(学問・教育)
- A/D、D/A?
シグナル(signal-to-noise ratio)をS/Nといい アナログディジタル変換器のことをA/D(analog-to-digital, analog to digital] conversion)といい ディジタルアナログ変換器のことをD/Aといいますが toを/であらわすのでしょうか? S/Nは比だから分かりますがA/DとD/Aは どう解釈したらいいのでしょうか? よろしくお願いします
- ベストアンサー
- その他(学問・教育)
- PICで小数点の演算
PIC16F877Aを使ってプログラムを作っています。その内容がセンサー(例えば温度センサー等)から取り入れた電圧をPICのA/D変換(10bit)を行って、その値を使ってpicで計算し、その結果を液晶に表示するといった内容なのですが、その計算過程で小数を扱わなければならないのですが、その計算がうまくいきません。A/D変換後の値をxとし具体的に式で書くと、 v = x * 5 / 1023 ・・・(1) ここでvはセンサーから取り込んだ電圧値(値の範囲は0.935~1.748)です。 y = 218.5 - v / 0.008 ・・・(2) 又は y = 218.5 - 125 * v ・・・(3) 上記の式はA/D変換後の値xを一度アナログ電圧値vに変換し(1)、そこから(2)又は(3)へ代入して得たい情報yを算出するといった少々面倒なものなのですが、これをアセンブラで書きたいのですが、このPICには乗除命令がないことや小数点の演算方法、16bitの乗除等の部分が引っかかってどうもうまくかけません。小数部分は固定小数点形式で考えて最終的にyは少数第二位を四捨五入したいと思っています。 どのようにプログラムを作ればよいのでしょうか。実際にソースを書いていただけると大変理解しやすいです。
- ベストアンサー
- その他(プログラミング・開発)
- C言語の問題です!!
C言語の問題です。よろしくお願いします。 A: 次の手順で処理を行うプログラムを作成しなさい. ・int型の変数n1,n2に数値9,3を代入する. ・変数n1,n2の値を"n1=xxx, n2=xxx"のように表示する. ・変数n1の値をn2倍にし,変数n2の値に2を加算する. ・変数n1,n2の値を表示する. ・変数n1とn2の互いの値を入れ替える. ・変数n1,n2の値を表示する. B: 本日の為替相場は,80円/ドル(int型の変数rate_dに格納)と114円/ユーロ(rate_e)である. ドル(usd)を与えて,ユーロ(euro)に変換するプログラムを作成せよ. ただし,小数点以下は切り捨てとする.
- ベストアンサー
- C・C++・C#
- お勧めのA/Dコンバータを教えて下さい。
FM放送を録音する際、パイオニアのD-HS5というDATレコーダのA/D変換機能を使い、D-HS5のS/PDIF出力をMacの内蔵光デジタル入力端子に繋いで48kHz16bitでAudacityで録音しています。音に不満が有る訳でもないのですが、今どきDATレコーダ?という感じもありますし、D-HS5も古い機種ですからいつまで正常に動いてくれるのか不安もあります。 パソコンに接続するD/Aコンバータはオーディオ用でも比較的選択肢が多いようですが、A/Dコンバータは楽器用以外にはあまり見かけません。 予算10万円程度で、D-HS5のA/D変換よりも高品質なA/Dコンバータはありませんでしょうか。パソコンはMacOS10.4.11、CPUはPowerPC G5です。
- ベストアンサー
- オーディオ
- 2進数の1の数を数える問題
次の問題に対して、以下のソースを考案し、実行したところ、以下のようになりました。 【問】 ◆◆◆◆◆ 与えられた10進数の整数Nを2進数に変換したときの1の個数を答えよ。 整数の10進数を2進数に変換するには、変換したい10進数を商が0になるまで2で割り続け、求めた余りの部分を逆順に並べる。 例) 13が入力として与えられた場合、以下のように2で割り続け2進数を求める。 13 / 2 = 6 ・・・余り 1 6 / 2 = 3 ・・・余り 0 3 / 2 = 1 ・・・余り 1 1 / 2 = 0 ・・・余り 1 求められたそれぞれの余りを逆順に並べたものが2進数への変換結果となる。 よって入力が13ならば2進数への変換結果は 1101 になり、1は3個あるので出力は3になる。 [入力例1] 13 [出力例1] 3 [入力例2] 45 [出力例2] 4 ◆◆◆◆◆ (自分の解答、□はタブ) ◆◆◆◆◆ #include <stdio.h> #include <stdlib.h> /* EXIT_SUCCESS */ int main(void) { □int n, bit, s; □scanf("%d", &n); □ □bit = n % 2; □n /= 2; □s = 0; □while(n) { □□if (bit) □□□s++; □bit = n % 2; □n /= 2; □} □printf("%d", s); □return EXIT_SUCCESS; } ◆◆◆◆◆ (実行結果1) ◆◆◆◆◆ [入力] 13 [出力] 2 ◆◆◆◆◆ (実行結果2) ◆◆◆◆◆ [入力] 45 [出力] 3 ◆◆◆◆◆ となり、正解となりません。 自分の考えとしては、入力された数値を変数nに収め、これをどんどん2で割っていき、そのときの余り(0か1)を変数bitに収めていき、nが0になるまで処理を繰り返し、bitが0でないとき、変数s(初期値0)に1ずつ加算していき、最後にsを出力する、という方針です。 初期値の設定辺りが間違っているのだと思いますが、これ以上いくら考えても正解が得られません。どこがどう間違っているのでしょうか。どなたかご教授頂きたく、お願い致します。
- ベストアンサー
- C・C++・C#
- ひずみゲージについて教えてください
こんにちは。 ひずみゲージについてお聞きしたいことがあります。 ・「ひずみ率」というものがあるようなのですが、だいたいどれくらいの値なのでしょうか。 ・出力がアナログ信号なのでA/D変換しないとパソコンに取り込めないのですが、一般にA/Dコンバータはどのようなものを使うのでしょうか。 よろしくお願いします。
- ベストアンサー
- 物理学
- シフト演算の問題です
2進数の値を左へn桁移動すると、もとの値の2^n倍になる。 例えば、左へ2ビット桁移動するともとの値の4倍となる。 この性質を利用して、左へ桁移動した値を複数加えることで行う乗算を考える。 なお、ここでは、桁移動して空いたビットには0が入るものとし、負数は考えないものとする。 左へ桁移動する関数として、"SHIFT(値、桁数)"を使う。 この関数は、引数の"値"を"桁数"ビット左へ桁移動した結果を返す。 もとの値をaとし、これを10倍するには、2倍した値と8倍した値を加えればよいので、次のような式になる。 SHIFT(a,1)+SHIFT(a,3) また別の考え方で10倍しようとすると、次のような式になる。 SHIFT((SHIFT(a,x)+a),y) 答えはx=2 y=1 です。 解説をお願いします。
- ベストアンサー
- その他(受験・進学)
- 平均の出し方
Excel初心者です。 下記のような平均を出す関数を教えてください。 日毎に3列使い、日々の処理数を集計しています。 A列、B列、D列、E列は数値又は空欄。 日計:C列はsum(A:B) 日計:F列はsum(D:E) 月合計計:Q列はsum(C,F・・・) Z列に処理平均を出したい。 C列とF列の値がゼロの時は平均の対象外にする。 average(C4,F4)とすると、数式が入っているせいか、結果が1.5になってしまいます。 ここにゼロや数式が入っているセルを除いた平均を出し、Z4に3と出るようにしたいです。 範囲が10個以上あるので、範囲指定もうまくできません。 A B C D E F ・・・ Q Z 1 9/1 9/2 9月 2 午前 午後 終日 午前 午後 終日 月合計 処理平均 3 4 1 5 1 3 4 9 4.5 4 2 1 3 3 3 5 1 5 6 6 6 6 6 1 7 5 5 12 6 宜しくお願い致します。
- ベストアンサー
- オフィス系ソフト
- java break文とラベル
・for文から合計の数値が1000を越えたら処理を終了するコードを削除する。 ・for文を10回繰り返すfor文を作る。 ・for文で値を1~100まで足したら値はりせっとせずに保持する。 (for文は1~100までを足すと5050になるので、5050にさらに1➕2➕3…と数を加算していく) ・加算結果の数値が20000を越えたら、全ての処理を終了する。 ・終了にはbreak文とラベルを使用する。 以上の条件の作成ができません。 public static void main(String []args){ outside : for(int n = 1: n <= 100; n++){ for(int a = 1; a <= 100; a++){ int i = 1; i += a; if(i > 20000){ break outside; } System.out.println(i); } } } } までは出来ました。 出力結果が1~19900までなりません。 どうしたらその結果になるのかわかる方教えてください。 お願いします。
- 締切済み
- Java
お礼
okazaki0koさん、遅ればせながらご回答ありがとうございました。 しばらくここを覗いてなかったのと、回答投稿のあったときにお知らせが届く設定になっていなかったようで、気づきませんでした。 実は、過去のトラ技にアルテラのMAX2が付録で添付されていたので 早速使っていました。(知らずに5V印加してこわしちゃいましたが・・・) 2のべき乗での加算処理に関しては、参考になりました。 改めて御礼申し上げます。ありがとうございました。