#pragma once //#include #include #include #include //#include #include #include "array.h" #include "ext_arm_lms_norm_f32.h" #define INT_WAVE 0 #define UNSINGED_INT_WAVE 1 #define FLOAT_WAVE 2 class WaveGenerator { private: const float FREQ = 120; const float GAIN = 0.8; float SAMPLE_RATE; int AS_nBIT_MAX_NUM; //量子化ビット数から算出した最大値(dex) //charp信号用_Juceから移植したのでリファクタリング推奨 const float fMin = 50; const float fMax = 700; const float tLength = 0.15; std::deque wave_sin; std::deque waveIntChirp; std::deque waveUnsingedIntChirp; void CreateSinWave(); void CreateChirpWave(); public: uint32_t sound_cnt = 0; WaveGenerator(int sp_rate,int quantifying_bit_number); int16_t playWaveSin(char mode); int16_t playWaveCharp(char mode); }; //model class ANC_DataBase { public: ANC_DataBase(); const float samplerate = 48000; static const int16_t WaveBufLen = 2000; //WaveBufLen >= CoefLenであること static const int16_t CoefWLen = 500;//(882 + 2400) ; static const int16_t CoefCLen = 300 ;//900 static const int16_t CoefHLen = 3800; float32_t coefW[CoefWLen]={0};//主経路 float32_t coefC[CoefCLen]={0};//二次経路 float32_t coefH[CoefHLen]={0};//ハウリング経路 float32_t lmsStateW[CoefWLen]={0}; float32_t lmsStateC[CoefCLen]={0}; float32_t lmsStateH[CoefHLen]={0}; //ちなみにmuのこと float32_t StepSizeW = 0.0004; float32_t StepSizeC = 0.95; float32_t StepSizeH = 0.95; arm_lms_norm_instance_f32 lmsInstance; const int SftBits = 0; //LMS用バッファー std::deque squaredXBuf; std::deque inputXBuf; std::deque filteredXBuf; std::deque outputYBuf; float32_t y = 0; float32_t yc = 0; float32_t err = 0; template void shiftBuffer(T inValue, std::deque& ioBuffer); template float calcFIR(const std::deque& inDataBuf, inoArray& filter_ary); template void InitFilter(T &Filter); void initCorfWFillter(); //クラス内部で適応フィルタを計算する //使い勝手を意識して引数多めにしているが、減らしてもいい //アルゴリズムを変更する場合はオーバーロードが妥当 template void calcAptiveFilter(float inErrValue, inoArray &ioW, float inStepSize, const std::deque& inXBuf, const std::deque& xAvaHelp ); template void IdentTransferFunction(float errGain, float TrainingWave, inoArray& TF, float inStepSize); //ANC用の波形を算出する(2マイク) CoefH CoefC 必須 TODO:未実装 void calcANCwave_FF(float errGain , float refGain); //ANC用の波形を算出する(2マイク) CoefH CoefC いらないTODO:未実装 void calcANCwave_Nopass(float32_t errGain , float32_t refGain); //ANC用の波形を算出する(1マイク) CoefC 必須 void calcANCwave_IMC(float errGain); //ANC用の波形を算出する(H∞フィルタ)CoefH CoefC 必須 TODO:未実装 void calcANCwave_HI(float errGain); }; #define AS_IMC 1 //1マイク運用 #define AS_FF 2 //2マイク運用 #define AS_NP_FF 3 //2マイク運用前処理ナシ #define AS_HI 4 //H∞フィルタ class ANC_Controller { public: //ANC構成情報 ANC_DataBase DB; //システム状態管理用の変数 static const char IDENTIFICAT_COEFC = 0; static const char ACTIVATION_ANC = 1; //static const int16_t IDENTIFICAT_coefH ANC_Controller(); //TrainingWaveと比較しながら経路の伝達関数を算出する。2ndとEchoで共通のプロパティを使っており、同時に実行することは想定していない。 //同時に動かすと地獄みたいに重くなるので1つずつ測定し、終了時にDB.IdentTransferFunction()すること void calc2ndPassTF(float errGain, float TrainingWave) ; void calcEchoPassTF(float errGain, float TrainingWave) ; /* ANCの出力波形を計算して波形を出力 AS_IMC 1 //1マイク運用 AS_FF 2 //2マイク運用 AS_HI 3 //H∞フィルタ */ float calcANCwave(const char methodNum , float errGain , float refGain); void printCoefH(); void printCoefC(); private: };