Nucleo-F446 による残響生成器 . DA変換器にデータを送る際は 4 倍にアップ・サンプリング.

Dependencies:   mbed SerialTxRxIntr F446_AD_DA_Multirate

Revision:
0:8473107e47de
Child:
1:47d242cf3d19
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sun Jan 20 10:46:15 2019 +0000
@@ -0,0 +1,81 @@
+//----------------------------------------------------------------------
+//  残響発生器
+//      残響発生処理の有効/無効の切り替え:PC の "F446_AD_DA_OnOff.exe"
+//
+//  2019/01/20, Copyright (c) 2019 MIKAMI, Naoki
+//----------------------------------------------------------------------
+
+#include "F446_Multirate.hpp"
+#include "reverb_unit.hpp"      // 残響生成ユニット
+#include "SerialRxTxIntr.hpp"
+#pragma diag_suppress 870   // マルチバイト文字使用の警告抑制のため
+
+using namespace Mikami;
+
+int main()
+{
+    printf("\r\n残響生成器を開始します.\r\n");
+
+    SerialRxTxIntr rxTx;    // Serial クラスの受送信割込み用オブジェクト
+    F446_Multirate myAdDa;  // 出力標本化周波数を4倍にするオブジェクト
+    const int FS = 10000;   // 入力の標本化周波数: 10 kHz
+
+    const float G_C = 0.8f;
+    const float G_A = 0.6f;
+    const float G0 = 1.0f - G_C;
+    CombFilter<887>    cm1(G_C);    // 櫛形フィルタによる残響生成ユニット
+    CombFilter<1153>   cm2(G_C);    // 櫛形フィルタによる残響生成ユニット
+    CombFilter<1499>   cm3(G_C);    // 櫛形フィルタによる残響生成ユニット
+    AllpassFilter<97>  ap1(G_A);    // 全域通過フィルタによる残響生成ユニット
+    AllpassFilter<131> ap2(G_A);    // 全域通過フィルタによる残響生成ユニット
+
+    bool sw = true;     // 残響生成有効/無効のスイッチ
+
+    // F446_Multirate::Start() と F446_Multirate::Input() の間に
+    // printf() のように重い処理は実行しないこと.
+    myAdDa.Start(FS);   // 標本化を開始する
+
+    while (true)
+    {
+        //------------------------------------------------------------
+        // ここにディジタルフィルタ等の処理を記述する
+        float xn = myAdDa.Input();      // 入力
+        float xn2 = G0*xn;
+
+        // 櫛形フィルタの並列接続部
+        float yn = cm1.Execute(xn2) + cm2.Execute(xn2)
+                 + cm3.Execute(xn2);
+
+        // 全域通過フィルタの縦続接続部
+        yn = ap2.Execute(ap1.Execute(yn));
+
+        // 入力信号(遅延なし)を加算
+        yn = yn + xn2;
+
+        if (sw) myAdDa.Output(yn);      // 出力:残響付き
+        else    myAdDa.Output(xn);      // 出力:入力そのまま
+        //------------------------------------------------------------
+
+        //------------------------------------------------------------
+        // PC からの指令に対応する処理
+        if (rxTx.IsEol())           // 受信バッファのデータが有効になった場合の処理
+        {
+            string str = rxTx.GetBuffer();
+            if (str == "ENQ")
+                rxTx.Tx("ACK\n");   // PC からの "ENQ" に対して "ACK" を送信する
+            else    // "ENQ" 以外の処理
+            {
+                if (str == "ST")    // PC から sw の状態の問い合わせ
+                {
+                    if (sw) rxTx.Tx("EN");     // 残響発生器が有効であることを返信
+                    else    rxTx.Tx("DS");     // 残響発生器が無効であることを返信
+                }
+                if (str == "ON")  sw = true;
+                if (str == "OFF") sw = false;  
+            }
+        }
+        // PC からの指令に対応する処理はここまで
+        //------------------------------------------------------------
+    }
+}
+