Nucleo-F446 による遮断周波数可変 LPF/HPF .DA変換器にデータを送る際は 4 倍にアップ・サンプリング.
Dependencies: mbed SerialTxRxIntr F446_AD_DA_MultirateSWI
main.cpp@2:03973d4684cb, 2018-06-11 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Mon Jun 11 11:11:15 2018 +0000
- Revision:
- 2:03973d4684cb
- Parent:
- 1:9c6f78551ab8
- Child:
- 3:98efe39edcf5
3
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MikamiUitOpen | 0:89d173001e82 | 1 | //---------------------------------------------------------------------- |
MikamiUitOpen | 0:89d173001e82 | 2 | // 遮断周波数可変 IIR フィルタ(LPF, HPF) |
MikamiUitOpen | 0:89d173001e82 | 3 | // |
MikamiUitOpen | 2:03973d4684cb | 4 | // PC 側のプログラム: F446_LPF_HPF_Variable |
MikamiUitOpen | 0:89d173001e82 | 5 | // 周波数特性が PC の画面に表示され,その上のカーソルをマウスでドラッグすることで, |
MikamiUitOpen | 0:89d173001e82 | 6 | // 遮断周波数を変えられる |
MikamiUitOpen | 0:89d173001e82 | 7 | // |
MikamiUitOpen | 2:03973d4684cb | 8 | // 2018/06/11, Copyright (c) 2018 MIKAMI, Naoki |
MikamiUitOpen | 0:89d173001e82 | 9 | //---------------------------------------------------------------------- |
MikamiUitOpen | 0:89d173001e82 | 10 | |
MikamiUitOpen | 0:89d173001e82 | 11 | #include "main.hpp" |
MikamiUitOpen | 0:89d173001e82 | 12 | using namespace Mikami; |
MikamiUitOpen | 0:89d173001e82 | 13 | |
MikamiUitOpen | 0:89d173001e82 | 14 | // 出力標本化周波数を4倍にするオブジェクト |
MikamiUitOpen | 0:89d173001e82 | 15 | F446_Multirate myAdDa_(ORDER_SM_, HK_SM_, G0_SM_); |
MikamiUitOpen | 0:89d173001e82 | 16 | // Serial クラスの受信割込み用オブジェクト |
MikamiUitOpen | 2:03973d4684cb | 17 | SerialRxTxIntr rx_; |
MikamiUitOpen | 0:89d173001e82 | 18 | |
MikamiUitOpen | 0:89d173001e82 | 19 | int main() |
MikamiUitOpen | 0:89d173001e82 | 20 | { |
MikamiUitOpen | 0:89d173001e82 | 21 | myAdDa_.Start(FS_); // ADC 変換終了割り込みを使えるようにする |
MikamiUitOpen | 0:89d173001e82 | 22 | |
MikamiUitOpen | 0:89d173001e82 | 23 | // 以下の割り込み優先順位の設定を忘れないこと |
MikamiUitOpen | 0:89d173001e82 | 24 | NVIC_SetPriority(ADC_IRQn, 0); // ADC 終了割り込み:最優先 |
MikamiUitOpen | 0:89d173001e82 | 25 | NVIC_SetPriority(USART2_IRQn, 1); // USART2 割り込み:次に優先 |
MikamiUitOpen | 0:89d173001e82 | 26 | |
MikamiUitOpen | 0:89d173001e82 | 27 | // 8 次の IIR フィルタ |
MikamiUitOpen | 0:89d173001e82 | 28 | const int ORDER = 8; |
MikamiUitOpen | 0:89d173001e82 | 29 | BilinearDesign design(ORDER, FS_); |
MikamiUitOpen | 0:89d173001e82 | 30 | Biquad::Coefs coefs[ORDER/2]; |
MikamiUitOpen | 0:89d173001e82 | 31 | float g0; |
MikamiUitOpen | 0:89d173001e82 | 32 | float fc = 1000.0f; // 最初に実行される LPF の遮断周波数 |
MikamiUitOpen | 0:89d173001e82 | 33 | design.Execute(fc, BilinearDesign::LPF, coefs, g0); // LPF |
MikamiUitOpen | 0:89d173001e82 | 34 | |
MikamiUitOpen | 0:89d173001e82 | 35 | IirCascade iir8(ORDER, coefs, g0); // IIR 縦続形のオブジェクト |
MikamiUitOpen | 0:89d173001e82 | 36 | float fcOld = fc; // 更新する前の遮断周波数 |
MikamiUitOpen | 0:89d173001e82 | 37 | bool on = true; // フィルタ処理の有効/無効を決める変数 |
MikamiUitOpen | 0:89d173001e82 | 38 | |
MikamiUitOpen | 0:89d173001e82 | 39 | while (true) |
MikamiUitOpen | 0:89d173001e82 | 40 | { |
MikamiUitOpen | 0:89d173001e82 | 41 | //------------------------------------------------------------ |
MikamiUitOpen | 0:89d173001e82 | 42 | // ここにディジタルフィルタ等の処理を記述する |
MikamiUitOpen | 0:89d173001e82 | 43 | float xn = myAdDa_.Input(); // 入力 |
MikamiUitOpen | 0:89d173001e82 | 44 | float yn = iir8.Execute(xn); // IIR フィルタの実行 |
MikamiUitOpen | 0:89d173001e82 | 45 | myAdDa_.Output(on ? yn : xn); // 出力 |
MikamiUitOpen | 0:89d173001e82 | 46 | //------------------------------------------------------------ |
MikamiUitOpen | 0:89d173001e82 | 47 | |
MikamiUitOpen | 0:89d173001e82 | 48 | //------------------------------------------------------------ |
MikamiUitOpen | 0:89d173001e82 | 49 | // PC からの指令に対応する処理 |
MikamiUitOpen | 0:89d173001e82 | 50 | if (rx_.IsEol()) // 受信バッファのデータが有効になった場合の処理 |
MikamiUitOpen | 0:89d173001e82 | 51 | { |
MikamiUitOpen | 0:89d173001e82 | 52 | string str = rx_.GetBuffer(); |
MikamiUitOpen | 0:89d173001e82 | 53 | if (str.find("ENQ") != string::npos) |
MikamiUitOpen | 0:89d173001e82 | 54 | rx_.Tx("ACK"); // "ACK" を送り返す |
MikamiUitOpen | 0:89d173001e82 | 55 | else if (str.find("ON") != string::npos) |
MikamiUitOpen | 0:89d173001e82 | 56 | on = true; // フィルタ処理を有効にする |
MikamiUitOpen | 0:89d173001e82 | 57 | else if (str.find("OFF") != string::npos) |
MikamiUitOpen | 0:89d173001e82 | 58 | on = false; // フィルタ処理を無効にする |
MikamiUitOpen | 0:89d173001e82 | 59 | else // "ENQ", "ON", "OFF" 以外は int 型の数値に対応する文字列として処理を行う |
MikamiUitOpen | 0:89d173001e82 | 60 | { |
MikamiUitOpen | 0:89d173001e82 | 61 | // PC から送信された遮断周波数を fc に保存 |
MikamiUitOpen | 0:89d173001e82 | 62 | fc = atoi(str.c_str()); |
MikamiUitOpen | 0:89d173001e82 | 63 | // フィルタの係数設計 |
MikamiUitOpen | 0:89d173001e82 | 64 | if (fc > 0) // LPF の係数を設計 |
MikamiUitOpen | 0:89d173001e82 | 65 | design.Execute(fc, BilinearDesign::LPF, coefs, g0); |
MikamiUitOpen | 0:89d173001e82 | 66 | else // HPF の係数を設計 |
MikamiUitOpen | 0:89d173001e82 | 67 | design.Execute(-fc, BilinearDesign::HPF, coefs, g0); |
MikamiUitOpen | 0:89d173001e82 | 68 | |
MikamiUitOpen | 0:89d173001e82 | 69 | // 設計されたフィルタ係数の設定 |
MikamiUitOpen | 0:89d173001e82 | 70 | iir8.SetCoefs(ORDER, coefs, g0); |
MikamiUitOpen | 0:89d173001e82 | 71 | |
MikamiUitOpen | 0:89d173001e82 | 72 | if (fc*fcOld < 0.0f) // LPF と HPF が切り替わった場合 |
MikamiUitOpen | 0:89d173001e82 | 73 | iir8.Clear(); // フィルタの遅延器をクリア |
MikamiUitOpen | 0:89d173001e82 | 74 | fcOld = fc; |
MikamiUitOpen | 0:89d173001e82 | 75 | } |
MikamiUitOpen | 0:89d173001e82 | 76 | } |
MikamiUitOpen | 0:89d173001e82 | 77 | // PC からの指令に対応する処理はここまで |
MikamiUitOpen | 0:89d173001e82 | 78 | //------------------------------------------------------------ |
MikamiUitOpen | 0:89d173001e82 | 79 | } |
MikamiUitOpen | 0:89d173001e82 | 80 | } |