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

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

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

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

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

2回答

4877閲覧

Arduinoで音の高低を調べる

GoldDNA

総合スコア14

C

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

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

4クリップ

投稿2016/01/14 10:13

マイクに音を入力しarduinoで音の高低を調べるためのプログラムを作成しました。
intens[]に音の高さごとに数値が入り、ある高さの成分が大きければその数値が大きくなるというプログラムにしたつもりですが、どうでしょうか?アドバイス等あればよろしくお願いします。

double a[9], b[9], v[9], intens[9];
int data[512];//512個のデータを取る
int MAX =512;
int T;
double theta;

void setup() {
Serial.begin(9600);// シリアル通信の初期化
for(int i=0;i<MAX;i++){
intens[i]=0.0;
}
}

void loop() {

for(int i=0;i<MAX;i++){
data[i]=analogRead(1);//マイクからの入力をdata[]に代入
}

for (int idx = 0, T = MAX; T >= 2; T /= 2,idx++) {
a[idx] = b[idx] = v[idx] = 0.0;
for (int i = 0; i < MAX; i++) {
theta = 2.0 * M_PI * (double)i / (double)T;
a[idx] += sin(theta) * data[i];
b[idx] += cos(theta) * data[i];
v[idx] += data[i] * data[i];
}
v[idx] = sqrt(v[idx]);
a[idx] /= v[idx];
b[idx] /= v[idx];
intens[idx] = sqrt(a[idx] * a[idx] + b[idx] * b[idx]);

Serial.println(intens[idx]);//intens[]の中身を表示 }

}

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

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

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

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

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

guest

回答2

0

やろうとしていることは離散フーリエ変換(DFT)だと言えます。
そしてそれを効率的に求めるには高速フーリエ変換(FFT)というアルゴリズムが知られています。

離散フーリエ変換がどういうものかについては、未完のサイトっぽいんですがここがイメージしやすい解説をしています。
http://energychord.com/children/math_and_phys/math/four/contents/four_disc.html

それをすっとばしてFFTの計算式はこちら
http://laputa.cs.shinshu-u.ac.jp/~yizawa/InfSys1/basic/chap7/index.htm

投稿2016/01/14 11:37

yuba

総合スコア5568

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

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

0

目的が見えないので、職業柄(リアルタイムでエンベディッドなおじさん)な意見を書きますが・・・

マイクからの入力は取りこぼしてもよいのでしょうか? 処理が間に合いますか? いささか、Arduino には重い処理のような気がします。もし、取りこぼしがのぼましくないのなら処理の最適化が必要な気がします。

もとめられる精度はどの程度なのでしょうか? 例えば最終的にバーグラフ表示など1、2ケタなど、高い精度が求められる応用でなければ、計算方法もさぼるなどの工夫も可能と思います。

もし、フーリエ変換が必須なら、畳み込み演算がそれなりに軽いと思います。ただ、結果の精度に対する要求がきつくないのなら、三角関数を固定小数点のテーブル検索にするなどの工夫をするのが良いかもしれません。

あと、精度に関係なくですけども、

C

1 for (int i = 0; i < MAX; i++) { 2 theta = 2.0 * M_PI * (double)i / (double)T;

この部分は、intからdoubleへの変換、doubleの掛け算と割り算が、MAX回ですが

C

1 delta = 2.0 * M_PI / (double)T; 2 theta = 0.0; 3 for (int i = 0; i < MAX; i++) { 4 theta += delta;

こんな感じにしますかねぇ。。。

投稿2016/01/17 09:02

T.Kanno

総合スコア915

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問