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

Dependencies:   mbed SerialTxRxIntr F446_AD_DA_Multirate

Committer:
MikamiUitOpen
Date:
Tue Jun 05 23:41:44 2018 +0000
Revision:
1:4c6a67b336d1
Parent:
0:0312aa1893cf
Child:
2:3a115b023dd2
2

Who changed what in which revision?

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