ANCcontroller.h 4.54 KB
Newer Older
杉下大河's avatar
杉下大河 committed
1
2
3
4
5
6
#pragma once

//#include <Arduino.h>
#include <deque>
#include <numeric>
#include <math.h>
7
8
//#include <stdlib.h>
#include <Arduino.h>
杉下大河's avatar
杉下大河 committed
9
10

#include "array.h"
11
#include "ext_arm_lms_norm_f32.h"
杉下大河's avatar
杉下大河 committed
12

13
14
15
#define INT_WAVE 0
#define UNSINGED_INT_WAVE 1
#define FLOAT_WAVE 2
杉下大河's avatar
杉下大河 committed
16
17
18
class WaveGenerator
{
  private:
19
20


杉下大河's avatar
杉下大河 committed
21
22
23
    const float FREQ = 120;
    const float GAIN = 0.8;

24
25
    float SAMPLE_RATE;
    int AS_nBIT_MAX_NUM; //量子化ビット数から算出した最大値(dex)
杉下大河's avatar
杉下大河 committed
26
27
28
29
30
31
    //charp信号用_Juceから移植したのでリファクタリング推奨
    const float fMin = 50;
    const float fMax = 700;
    const float tLength = 0.15;

    std::deque<int16_t> wave_sin;
32
33
    std::deque<int16_t> waveIntChirp;
    std::deque<int16_t> waveUnsingedIntChirp;
杉下大河's avatar
杉下大河 committed
34
35
36
37
38
39

    void CreateSinWave();
    void CreateChirpWave();

  public:

40
    uint32_t sound_cnt = 0;
杉下大河's avatar
杉下大河 committed
41

42
    WaveGenerator(int sp_rate,int quantifying_bit_number);
杉下大河's avatar
杉下大河 committed
43
44


45
46
    int16_t playWaveSin(char mode);
    int16_t playWaveCharp(char mode);
杉下大河's avatar
杉下大河 committed
47
48
49
50
51
52
53
54
55
56
57
58

};

//model
class ANC_DataBase {
  public:
    ANC_DataBase();

    const float samplerate = 48000;
    static const int16_t WaveBufLen = 2000;

    //WaveBufLen >= CoefLenであること
59
    static const int16_t CoefWLen = 500;//(882 + 2400) ;
60
    static const int16_t CoefCLen = 300 ;//900
杉下大河's avatar
杉下大河 committed
61
62
    static const int16_t CoefHLen = 3800;

63
64
65
66
67
68
69
70
71
72
73
74
75
76
    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;
杉下大河's avatar
杉下大河 committed
77

78
    const int SftBits = 0;
杉下大河's avatar
杉下大河 committed
79
80
81
82
83
84
85

    //LMS用バッファー
    std::deque<float> squaredXBuf;
    std::deque<float> inputXBuf;
    std::deque<float> filteredXBuf;
    std::deque<float> outputYBuf;

86
87
88
89
    float32_t y = 0;
    float32_t yc = 0;
    
    float32_t err = 0;
杉下大河's avatar
杉下大河 committed
90
91
92
93
94
95
96
97
98
99

    template <class T>
    void shiftBuffer(T inValue, std::deque<T>& ioBuffer);

    template<class T, class U, size_t FilterSize >
    float calcFIR(const std::deque<T>& inDataBuf, inoArray<U, FilterSize>& filter_ary);

    template <class T>
    void InitFilter(T &Filter);

100
101
    void initCorfWFillter();
    
杉下大河's avatar
杉下大河 committed
102
103
104
105
106
107
108
109
110
111
112
113
114
    //クラス内部で適応フィルタを計算する
    //使い勝手を意識して引数多めにしているが、減らしてもいい
    //アルゴリズムを変更する場合はオーバーロードが妥当
    template<class T, size_t FilterSize >
    void calcAptiveFilter(float inErrValue, inoArray<T, FilterSize> &ioW, float inStepSize, const std::deque<T>& inXBuf, const std::deque<T>& xAvaHelp );

    template<class T, size_t FilterSize >
    void IdentTransferFunction(float errGain, float TrainingWave, inoArray<T, FilterSize>& TF, float inStepSize);

    //ANC用の波形を算出する(2マイク) CoefH CoefC 必須 TODO:未実装
    void calcANCwave_FF(float errGain , float refGain);
    
    //ANC用の波形を算出する(2マイク) CoefH CoefC いらないTODO:未実装
115
    void calcANCwave_Nopass(float32_t errGain , float32_t refGain);
杉下大河's avatar
杉下大河 committed
116
117
118
119
120
121
122
123
124
125
126
127

    //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マイク運用
128
129
130
131
#define AS_NP_FF 3  //2マイク運用前処理ナシ
#define AS_HI 4  //H∞フィルタ


杉下大河's avatar
杉下大河 committed
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
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);


159
160
161
    void printCoefH();
    void printCoefC();
    
杉下大河's avatar
杉下大河 committed
162
163
164
  private:

};