CQエレクトロニクス・セミナで使用するグラフィック・イコライザ のプログラム
Dependencies: mbed SerialTxRxIntr DSP_MultirateLinearphase
main.cpp@1:c30bdcb9ba69, 2022-03-29 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Tue Mar 29 11:11:20 2022 +0000
- Revision:
- 1:c30bdcb9ba69
- Parent:
- 0:b3c94b253ae5
- Child:
- 2:e97eaf13aa89
2
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MikamiUitOpen | 0:b3c94b253ae5 | 1 | //---------------------------------------------------------------------- |
MikamiUitOpen | 0:b3c94b253ae5 | 2 | // グラフィック・イコライザ,DA 出力はアップサンプリング使用 |
MikamiUitOpen | 0:b3c94b253ae5 | 3 | // フィルタの係数の計算をマイコン側でも行うタイプ |
MikamiUitOpen | 0:b3c94b253ae5 | 4 | // |
MikamiUitOpen | 0:b3c94b253ae5 | 5 | // PC 側のプログラム: F446_GraphicEqualizerB |
MikamiUitOpen | 0:b3c94b253ae5 | 6 | // |
MikamiUitOpen | 1:c30bdcb9ba69 | 7 | // 2022/03/29, 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 | } |