CQエレクトロニクス・セミナで使用するグラフィック・イコライザ のプログラム

Dependencies:   mbed SerialTxRxIntr DSP_MultirateLinearphase

Committer:
MikamiUitOpen
Date:
Wed Mar 30 04:58:18 2022 +0000
Revision:
2:e97eaf13aa89
Parent:
1:c30bdcb9ba69
3

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:b3c94b253ae5 1 //----------------------------------------------------------------------
MikamiUitOpen 0:b3c94b253ae5 2 // グラフィック・イコライザ,DA 出力はアップサンプリング使用
MikamiUitOpen 2:e97eaf13aa89 3 // フィルタの係数は PC で計算し,それをマイコン側に転送するタイプ
MikamiUitOpen 0:b3c94b253ae5 4 //
MikamiUitOpen 0:b3c94b253ae5 5 // PC 側のプログラム: F446_GraphicEqualizerB
MikamiUitOpen 0:b3c94b253ae5 6 //
MikamiUitOpen 2:e97eaf13aa89 7 // 2022/03/30, Copyright (c) 2022 MIKAMI, Naoki
MikamiUitOpen 0:b3c94b253ae5 8 //----------------------------------------------------------------------
MikamiUitOpen 0:b3c94b253ae5 9
MikamiUitOpen 0:b3c94b253ae5 10 #include "MultirateLiPh.hpp" // DA でアップサンプリング
MikamiUitOpen 0:b3c94b253ae5 11 #include "SerialRxTxIntr.hpp"
MikamiUitOpen 0:b3c94b253ae5 12 #include "GraphicEqualizer.hpp"
MikamiUitOpen 0:b3c94b253ae5 13 #include <cctype> // isalpha(), isdigit() で使用
MikamiUitOpen 0:b3c94b253ae5 14 using namespace Mikami;
MikamiUitOpen 0:b3c94b253ae5 15
MikamiUitOpen 0:b3c94b253ae5 16 const float FS_ = 44.1f; // 入力の標本化周波数: 44.1 kHz
MikamiUitOpen 0:b3c94b253ae5 17 MultirateLiPh myAdDa_(FS_); // 出力標本化周波数を4倍にするオブジェクト
MikamiUitOpen 0:b3c94b253ae5 18
MikamiUitOpen 0:b3c94b253ae5 19 const int BANDS_ = 9; // グラフィック・イコライザのバンド数
MikamiUitOpen 0:b3c94b253ae5 20 GrEqualizer grEq_(BANDS_, FS_*1000); // グラフィック・イコライザ用オブジェクト
MikamiUitOpen 0:b3c94b253ae5 21
MikamiUitOpen 1:c30bdcb9ba69 22 void Select(string str); // 有効,無効,出力 On/Off に対応する処理の選択
MikamiUitOpen 0:b3c94b253ae5 23 void NumericCtrl(string str); // 帯域ごとの利得調整
MikamiUitOpen 0:b3c94b253ae5 24
MikamiUitOpen 0:b3c94b253ae5 25 // グラフィック・イコライザの信号処理
MikamiUitOpen 0:b3c94b253ae5 26 void AdcIsr()
MikamiUitOpen 0:b3c94b253ae5 27 {
MikamiUitOpen 1:c30bdcb9ba69 28 float xn = myAdDa_.Input(); // 入力
MikamiUitOpen 1:c30bdcb9ba69 29 float yn = grEq_.Execute(xn); // グラフィック・イコライザの処理
MikamiUitOpen 1:c30bdcb9ba69 30 myAdDa_.Output(yn); // 出力
MikamiUitOpen 0:b3c94b253ae5 31 }
MikamiUitOpen 0:b3c94b253ae5 32
MikamiUitOpen 0:b3c94b253ae5 33 int main()
MikamiUitOpen 0:b3c94b253ae5 34 {
MikamiUitOpen 1:c30bdcb9ba69 35 SerialRxTxIntr rx(72); // PC との通信用,バッファサイズ:72,9600 baud
MikamiUitOpen 0:b3c94b253ae5 36
MikamiUitOpen 0:b3c94b253ae5 37 NVIC_SetPriority(ADC_IRQn, 0); // AD変換終了割り込みの優先度が最高
MikamiUitOpen 0:b3c94b253ae5 38 NVIC_SetPriority(USART2_IRQn, 1);
MikamiUitOpen 0:b3c94b253ae5 39
MikamiUitOpen 0:b3c94b253ae5 40 myAdDa_.Start(&AdcIsr); // 標本化を開始する
MikamiUitOpen 0:b3c94b253ae5 41 while (true)
MikamiUitOpen 0:b3c94b253ae5 42 {
MikamiUitOpen 0:b3c94b253ae5 43 if (rx.IsEol()) // PC からの指令に対応する処理
MikamiUitOpen 0:b3c94b253ae5 44 {
MikamiUitOpen 0:b3c94b253ae5 45 string str = rx.GetBuffer();
MikamiUitOpen 0:b3c94b253ae5 46 if (str == "GrEqB") rx.TxString("ACK\n"); // "ACK" を送り返す
MikamiUitOpen 0:b3c94b253ae5 47 else
MikamiUitOpen 0:b3c94b253ae5 48 {
MikamiUitOpen 0:b3c94b253ae5 49 if (isalpha(str[0])) Select(str);
MikamiUitOpen 0:b3c94b253ae5 50 if (isdigit(str[0])) NumericCtrl(str);
MikamiUitOpen 0:b3c94b253ae5 51 // 第1文字がアルファベットでも数字でもない場合は何もしない
MikamiUitOpen 0:b3c94b253ae5 52 }
MikamiUitOpen 0:b3c94b253ae5 53 }
MikamiUitOpen 0:b3c94b253ae5 54 }
MikamiUitOpen 0:b3c94b253ae5 55 }
MikamiUitOpen 0:b3c94b253ae5 56
MikamiUitOpen 1:c30bdcb9ba69 57 // 有効,無効,出力 On/Off に対応する処理の選択
MikamiUitOpen 0:b3c94b253ae5 58 void Select(string str)
MikamiUitOpen 0:b3c94b253ae5 59 {
MikamiUitOpen 0:b3c94b253ae5 60 if (str == "ACTIVE") grEq_.Validate(); // フィルタ処理有効
MikamiUitOpen 0:b3c94b253ae5 61 if (str == "THROUGH") grEq_.Invalidate(); // フィルタ処理無効
MikamiUitOpen 0:b3c94b253ae5 62 if (str == "ON") grEq_.SetOn(); // 出力を On
MikamiUitOpen 0:b3c94b253ae5 63 if (str == "OFF") grEq_.SetOff(); // 出力を Off
MikamiUitOpen 0:b3c94b253ae5 64 }
MikamiUitOpen 0:b3c94b253ae5 65
MikamiUitOpen 0:b3c94b253ae5 66 // 帯域ごとの利得調整
MikamiUitOpen 0:b3c94b253ae5 67 void NumericCtrl(string str)
MikamiUitOpen 0:b3c94b253ae5 68 {
MikamiUitOpen 0:b3c94b253ae5 69 // 最初の2文字はフィルタの番号
MikamiUitOpen 0:b3c94b253ae5 70 int band = atoi(str.substr(0, 2).c_str()); // フィルタの番号
MikamiUitOpen 0:b3c94b253ae5 71 // 次の文字からは係数の値
MikamiUitOpen 0:b3c94b253ae5 72 const int N = 5; // 係数の個数
MikamiUitOpen 0:b3c94b253ae5 73 const int L0 = 13; // 一つの係数に対する文字数
MikamiUitOpen 0:b3c94b253ae5 74 float c[N];
MikamiUitOpen 0:b3c94b253ae5 75 for (int n=0; n<N; n++)
MikamiUitOpen 0:b3c94b253ae5 76 c[n] = atof(str.substr(n*L0+2, L0).c_str());
MikamiUitOpen 0:b3c94b253ae5 77 grEq_.SetCoefficients(band,
MikamiUitOpen 0:b3c94b253ae5 78 (BiquadGrEq::Coefs){c[0], c[1], c[2], c[3], c[4]});
MikamiUitOpen 1:c30bdcb9ba69 79 }