Nucleo-F446 によるグラフィック・イコライザ.DA変換器にデータを送る際は 4 倍にアップ・サンプリング.
Dependencies: mbed SerialTxRxIntr F446_AD_DA_Multirate
main.cpp@1:4c6a67b336d1, 2018-06-05 (annotated)
- 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?
User | Revision | Line number | New 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 | } |