Nucleo-F446 によるグラフィック・イコライザ.DA変換器にデータを送る際は 4 倍にアップ・サンプリング.

Dependencies:   mbed SerialTxRxIntr F446_AD_DA_Multirate

Committer:
MikamiUitOpen
Date:
Thu Jan 31 12:40:34 2019 +0000
Revision:
6:7dd696fe86c8
Parent:
5:a4f15be9afb7
7

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:0312aa1893cf 1 //----------------------------------------------------------------------
MikamiUitOpen 2:3a115b023dd2 2 // グラフィック・イコライザ
MikamiUitOpen 0:0312aa1893cf 3 //
MikamiUitOpen 2:3a115b023dd2 4 // PC 側のプログラム: F446_GraphicEqualizer
MikamiUitOpen 0:0312aa1893cf 5 //
MikamiUitOpen 6:7dd696fe86c8 6 // 2019/01/31, Copyright (c) 2019 MIKAMI, Naoki
MikamiUitOpen 0:0312aa1893cf 7 //----------------------------------------------------------------------
MikamiUitOpen 0:0312aa1893cf 8
MikamiUitOpen 0:0312aa1893cf 9 #include "main.hpp"
MikamiUitOpen 0:0312aa1893cf 10 using namespace Mikami;
MikamiUitOpen 0:0312aa1893cf 11
MikamiUitOpen 0:0312aa1893cf 12 // 出力標本化周波数を4倍にするオブジェクト
MikamiUitOpen 0:0312aa1893cf 13 F446_Multirate myAdDa_(ORDER_SM_, HK_SM_, G0_SM_);
MikamiUitOpen 0:0312aa1893cf 14 // Serial クラスの受信割込み用オブジェクト
MikamiUitOpen 2:3a115b023dd2 15 SerialRxTxIntr rx_;
MikamiUitOpen 0:0312aa1893cf 16
MikamiUitOpen 0:0312aa1893cf 17 int main()
MikamiUitOpen 0:0312aa1893cf 18 {
MikamiUitOpen 0:0312aa1893cf 19 myAdDa_.Start(FS_); // ADC 変換終了割り込みを使えるようにする
MikamiUitOpen 0:0312aa1893cf 20
MikamiUitOpen 0:0312aa1893cf 21 // 以下の割り込み優先順位の設定を忘れないこと
MikamiUitOpen 0:0312aa1893cf 22 NVIC_SetPriority(ADC_IRQn, 0); // ADC 終了割り込み:最優先
MikamiUitOpen 0:0312aa1893cf 23 NVIC_SetPriority(USART2_IRQn, 1); // USART2 割り込み:次に優先
MikamiUitOpen 0:0312aa1893cf 24
MikamiUitOpen 0:0312aa1893cf 25 // グラフィック・イコライザ用パラメータ等の定義
MikamiUitOpen 0:0312aa1893cf 26 const int BANDS = 9;
MikamiUitOpen 0:0312aa1893cf 27 const float Q_VAL = 1.0f/sqrtf(2.0f); // フィルタの Q 値
MikamiUitOpen 0:0312aa1893cf 28 GrEqParams params(BANDS, FS_); // グラフィック・イコライザで使うフィルタの
MikamiUitOpen 0:0312aa1893cf 29 // 係数を計算するオブジェクト
MikamiUitOpen 0:0312aa1893cf 30 BiquadGrEq biquad[BANDS]; // グラフィック・イコライザで使うフィルタ
MikamiUitOpen 0:0312aa1893cf 31 float f0[BANDS]; // 中心周波数(ピーキング・フィルタの場合)
MikamiUitOpen 0:0312aa1893cf 32 for (int n=0; n<BANDS; n++) f0[n] = 62.5f*powf(2, n);
MikamiUitOpen 0:0312aa1893cf 33 for (int n=0; n<BANDS; n++)
MikamiUitOpen 0:0312aa1893cf 34 biquad[n].SetCoefficients(params.Get(n, f0[n], 0, Q_VAL));
MikamiUitOpen 0:0312aa1893cf 35
MikamiUitOpen 0:0312aa1893cf 36 bool on = true; // フィルタ処理の有効/無効を決める変数
MikamiUitOpen 0:0312aa1893cf 37
MikamiUitOpen 0:0312aa1893cf 38 while (true)
MikamiUitOpen 0:0312aa1893cf 39 {
MikamiUitOpen 0:0312aa1893cf 40 //------------------------------------------------------------
MikamiUitOpen 0:0312aa1893cf 41 // ここにディジタルフィルタ等の処理を記述する
MikamiUitOpen 0:0312aa1893cf 42 float xn = myAdDa_.Input()*0.25f; // 入力
MikamiUitOpen 0:0312aa1893cf 43 float yn = xn;
MikamiUitOpen 0:0312aa1893cf 44 for (int n=0; n<BANDS; n++) yn =biquad[n].Execute(yn);
MikamiUitOpen 0:0312aa1893cf 45 // 実行時間:約 7 μs
MikamiUitOpen 0:0312aa1893cf 46 myAdDa_.Output(on ? yn : xn); // 出力
MikamiUitOpen 0:0312aa1893cf 47 //------------------------------------------------------------
MikamiUitOpen 0:0312aa1893cf 48
MikamiUitOpen 0:0312aa1893cf 49 //------------------------------------------------------------
MikamiUitOpen 0:0312aa1893cf 50 // PC からの指令に対応する処理
MikamiUitOpen 0:0312aa1893cf 51 if (rx_.IsEol()) // 受信バッファのデータが有効になった場合の処理
MikamiUitOpen 0:0312aa1893cf 52 {
MikamiUitOpen 0:0312aa1893cf 53 string str = rx_.GetBuffer();
MikamiUitOpen 5:a4f15be9afb7 54 if (str == "GrEq")
MikamiUitOpen 5:a4f15be9afb7 55 rx_.Tx("ACK\n"); // "ACK" を送り返す
MikamiUitOpen 5:a4f15be9afb7 56 else if (str == "ACTIVE")
MikamiUitOpen 0:0312aa1893cf 57 on = true; // フィルタ処理を有効にする
MikamiUitOpen 5:a4f15be9afb7 58 else if (str == "THROUGH")
MikamiUitOpen 0:0312aa1893cf 59 on = false; // フィルタ処理を無効にする
MikamiUitOpen 5:a4f15be9afb7 60 else if (str == "FLAT")
MikamiUitOpen 0:0312aa1893cf 61 for (int n=0; n<BANDS; n++) // フィルタの特性を平坦にする
MikamiUitOpen 0:0312aa1893cf 62 biquad[n].SetCoefficients(params.Get(n, f0[n], 0, Q_VAL));
MikamiUitOpen 5:a4f15be9afb7 63 // "GrEq", "ON", "OFF", "FLAT" 以外は float 型の数値に対応する文字列とし
MikamiUitOpen 0:0312aa1893cf 64 // て処理を行う
MikamiUitOpen 0:0312aa1893cf 65 else
MikamiUitOpen 0:0312aa1893cf 66 {
MikamiUitOpen 0:0312aa1893cf 67 // 最初の文字はフィルタの番号
MikamiUitOpen 0:0312aa1893cf 68 int k = atoi(str.substr(0, 1).c_str()); // フィルタの番号
MikamiUitOpen 0:0312aa1893cf 69 // 次の文字からは dB 値
MikamiUitOpen 0:0312aa1893cf 70 str.erase(0, 1);
MikamiUitOpen 0:0312aa1893cf 71 float db = atof(str.c_str());
MikamiUitOpen 0:0312aa1893cf 72 biquad[k].SetCoefficients(params.Get(k, f0[k], db, Q_VAL));
MikamiUitOpen 0:0312aa1893cf 73 }
MikamiUitOpen 0:0312aa1893cf 74 }
MikamiUitOpen 0:0312aa1893cf 75 // PC からの指令に対応する処理はここまで
MikamiUitOpen 0:0312aa1893cf 76 //------------------------------------------------------------
MikamiUitOpen 0:0312aa1893cf 77 }
MikamiUitOpen 0:0312aa1893cf 78 }