Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
杉下大河
EmbeddedANC-STM32F767
Commits
576cd3b4
Commit
576cd3b4
authored
Aug 24, 2020
by
杉下大河
Browse files
DSPライブラリ未使用版実装完了…まぁ重いよね
parent
5729f693
Changes
5
Hide whitespace changes
Inline
Side-by-side
.vscode/c_cpp_properties.json
View file @
576cd3b4
...
...
@@ -3,8 +3,10 @@
{
"name"
:
"Win32"
,
"includePath"
:
[
"${workspaceRoot}"
,
"C:
\\
Users
\\
morson
\\
AppData
\\
Local
\\
Arduino15
\\
packages
\\
STM32
\\
tools
\\
**"
,
"C:
\\
Users
\\
morson
\\
AppData
\\
Local
\\
Arduino15
\\
packages
\\
STM32
\\
hardware
\\
stm32
\\
1.9.0
\\
**"
,
"C:
\\
Program Files (x86)
\\
Arduino
\\
libraries
\\
**"
,
"C:
\\
Users
\\
morson
\\
Documents
\\
Arduino
\\
libraries
\\
**"
],
"forcedInclude"
:
[
...
...
ANCcontroller.cpp
View file @
576cd3b4
#define _USE_MATH_DEFINES //for Visual Studio
#include
"ANCcontroller.h"
WaveGenerator
::
WaveGenerator
()
WaveGenerator
::
WaveGenerator
(
int
sp_rate
,
int
quantifying_bit_number
)
{
AS_nBIT_MAX_NUM
=
pow
(
2
,
quantifying_bit_number
)
-
1
;
SAMPLE_RATE
=
sp_rate
;
CreateSinWave
();
CreateChirpWave
();
}
//
sin波作る
//
符号あり整数値sin波を生成する(-AS_nBIT_MAX_NUM ~ AS_nBIT_MAX_NUM)
void
WaveGenerator
::
CreateSinWave
()
{
auto
rad_step
=
2
*
M_PI
*
FREQ
/
SAMPLE_RATE
;
for
(
int
i
=
0
;
i
<
SAMPLE_RATE
/
FREQ
;
i
++
)
for
(
int
i
=
0
;
i
<
SAMPLE_RATE
;
i
++
)
{
wave_sin
.
push_back
(
AS_
16
BIT_MAX_NUM
*
sin
(
rad_step
*
i
)
*
GAIN
);
wave_sin
.
push_back
(
AS_
n
BIT_MAX_NUM
*
sin
(
rad_step
*
i
)
*
GAIN
);
}
}
...
...
@@ -47,22 +49,54 @@ void WaveGenerator::CreateChirpWave() {
for
(
const
auto
&
w
:
waveChirpSignal
)
{
waveChirp
.
emplace_back
(
int
(
w
*
AS_16BIT_MAX_NUM
*
GAIN
));
waveIntChirp
.
emplace_back
(
int
(
w
*
AS_nBIT_MAX_NUM
*
GAIN
));
}
for
(
const
auto
&
w
:
waveChirpSignal
)
{
waveUnsingedIntChirp
.
emplace_back
(
int
((
w
+
1
)
*
AS_nBIT_MAX_NUM
*
GAIN
*
0.5
));
}
}
//1
6bit情報に変換した
sinを吐き出す
int16_t
WaveGenerator
::
playWaveSin
()
//1
コールに付き1信号分
sin
波
を吐き出す
int16_t
WaveGenerator
::
playWaveSin
(
char
mode
)
{
auto
out
=
wave_sin
[
sound_cnt
%
wave_sin
.
size
()];
int
out
=
0
;
switch
(
mode
){
case
INT_WAVE
:
out
=
wave_sin
[
sound_cnt
%
wave_sin
.
size
()];
break
;
case
UNSINGED_INT_WAVE
:
out
=
(
wave_sin
[
sound_cnt
%
wave_sin
.
size
()]
+
AS_nBIT_MAX_NUM
)
/
2
;
break
;
case
FLOAT_WAVE
:
//TODO もし実装するならCreateSinWaveを直すところから
break
;
}
sound_cnt
++
;
return
out
;
}
//1
6bit情報に変換した
チャープ信号を吐き出す
int16_t
WaveGenerator
::
playWaveCharp
()
//1
コールに付き1信号分
チャープ信号を吐き出す
int16_t
WaveGenerator
::
playWaveCharp
(
char
mode
)
{
auto
out
=
waveChirp
[
sound_cnt
%
waveChirp
.
size
()];
int
out
=
0
;
switch
(
mode
){
case
INT_WAVE
:
out
=
waveIntChirp
[
sound_cnt
%
waveIntChirp
.
size
()];
break
;
case
UNSINGED_INT_WAVE
:
out
=
waveUnsingedIntChirp
[
sound_cnt
%
waveUnsingedIntChirp
.
size
()];
break
;
case
FLOAT_WAVE
:
//TODO もし実装するならCreateSinWaveを直すところから
break
;
}
sound_cnt
++
;
return
out
;
}
...
...
@@ -219,4 +253,18 @@ float ANC_Controller::calcANCwave(const char methodNum , float errGain , float r
}
return
DB
.
y
;
}
void
ANC_Controller
::
printCoefC
(){
for
(
const
auto
&
e
:
DB
.
coefC
){
printf
(
"%d,"
,
e
);
}
printf
(
"
\n
"
);
}
void
ANC_Controller
::
printCoefH
(){
for
(
const
auto
&
e
:
DB
.
coefH
){
printf
(
"%d,"
,
e
);
}
printf
(
"
\n
"
);
}
\ No newline at end of file
ANCcontroller.h
View file @
576cd3b4
...
...
@@ -4,48 +4,47 @@
#include
<deque>
#include
<numeric>
#include
<math.h>
//#include <stdlib.h>
#include
<Arduino.h>
#include
"array.h"
class
WaveGenerator
{
private:
const
int16_t
AS_16BIT_MAX_NUM
=
32767
;
const
int16_t
AS_12BIT_MAX_NUM
=
4095
;
const
float
FREQ
=
120
;
const
float
SAMPLE_RATE
=
48000
;
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
<
int16_t
>
wave_sin
;
std
::
deque
<
int16_t
>
waveChirp
;
std
::
deque
<
int16_t
>
waveIntChirp
;
std
::
deque
<
int16_t
>
waveUnsingedIntChirp
;
void
CreateSinWave
();
void
CreateChirpWave
();
public:
uint32_t
sound_cnt
=
0
;
WaveGenerator
()
;
static
const
char
INT_WAVE
=
0
;
static
const
char
UNSINGED_INT_WAVE
=
1
;
static
const
char
FLOAT_WAVE
=
2
;
int16_t
playWaveSin
();
int16_t
playWaveCharp
();
void
dumpWaveDat
()
{
#if 0 //チャープ信号の内容をCSVで出力できます
std::string outFileName = "Charpwave.csv";
std::ofstream wavedat(outFileName);
for (auto &w : waveChirpSignal )
wavedat << w << ",";
#endif
uint32_t
sound_cnt
=
0
;
}
WaveGenerator
(
int
sp_rate
,
int
quantifying_bit_number
);
int16_t
playWaveSin
(
char
mode
);
int16_t
playWaveCharp
(
char
mode
);
};
...
...
@@ -59,7 +58,7 @@ class ANC_DataBase {
//WaveBufLen >= CoefLenであること
static
const
int16_t
CoefWLen
=
(
882
+
2400
)
;
static
const
int16_t
CoefCLen
=
9
00
;
static
const
int16_t
CoefCLen
=
3
00
;
//900
static
const
int16_t
CoefHLen
=
3800
;
inoArray
<
float
,
CoefCLen
>
coefC
;
//主経路
...
...
@@ -146,6 +145,9 @@ class ANC_Controller {
//算出後の波形データを吐き出す
float
playANCwave
()
{
return
DB
.
y
;}
void
printCoefH
();
void
printCoefC
();
private:
};
STM32F767_ANC_IMC.ino
View file @
576cd3b4
#include
"ANCcontroller.h"
//#include <STM32ADC.h>
//#include <libmaple/adc.h>
//#include <CMSIS_DSP.h>
HardwareTimer
Timer1
(
TIM1
);
// the setup function runs once when you press reset or power the board
uint8_t
sw
=
LOW
;
int
sensorPin
=
A6
;
// select the input pin for the potentiometer
int
biasPin
=
A12
;
int
audioOut
=
A13
;
int
sensorValue
=
0
;
// variable to store the value coming from the sensor
int
audioOutPin
=
A13
;
const
int
Q_BIT_NUM
=
12
;
const
int
AS_SYS_SAMPLERATE
=
4000
*
2
;
const
int
AUDIO_BIAS
=
2482
;
//3.3V中の2V(12bit)
char
anc_state
;
bool
Sendflg
=
true
;
bool
calocReadyFlg
=
false
;
int
sendTimingCnt
=
0
;
int
audioInValue
=
0
;
// variable to store the value coming from the sensor
int
audioOutValue
=
0
;
uint32_t
t1
,
t2
;
WaveGenerator
s_sound
(
AS_SYS_SAMPLERATE
,
Q_BIT_NUM
);
ANC_Controller
ANC
;
void
sendDebugdat
(){
sw
^=
1
;
digitalWrite
(
LED_GREEN
,
sw
);
printf
(
"%d
\n
"
,
sensorValue
);
printf
(
"%d
\n
"
,
audioInValue
);
}
//adcは最適値を設定すれば高速化できる余地あり現在30μs
void
audioreader
()
{
sensorValue
=
analogRead
(
sensorPin
);
//多分12bitで読み取る
audioInValue
=
analogRead
(
sensorPin
);
//多分12bitで読み取る
analogWrite
(
audioOutPin
,
audioOutValue
);
sendTimingCnt
++
;
calocReadyFlg
=
true
;
}
void
audioreader_debug
()
{
t1
=
micros
();
audioInValue
=
analogRead
(
sensorPin
);
//多分12bitで読み取る
sendTimingCnt
++
;
analogWrite
(
audioOut
,
sensorValue
*
5
);
t2
=
micros
();
printf
(
" t=%d
\n
"
,
t2
-
t1
);
}
void
setup
()
{
// initialize digital pin LED_BUILTIN as an output.
pinMode
(
LED_GREEN
,
OUTPUT
);
pinMode
(
audioOut
,
OUTPUT
);
pinMode
(
audioOut
Pin
,
OUTPUT
);
pinMode
(
biasPin
,
OUTPUT
);
pinMode
(
sensorPin
,
INPUT_ANALOG
);
analogWriteResolution
(
12
);
//analogwriteを12bit(MAX4095)で利用できるように設定
analogReadResolution
(
12
);
analogWrite
(
biasPin
,
2482
);
analogWriteResolution
(
Q_BIT_NUM
);
//analogwriteを12bit(MAX4095)で利用できるように設定
analogReadResolution
(
Q_BIT_NUM
);
analogWrite
(
biasPin
,
2482
);
//MAX3.3vの2.0V
Timer1
.
pause
();
// タイマー停止
//Timer1.setOverflow(4000,HERTZ_FORMAT); // 4000Hzで呼び出し
Timer1
.
setOverflow
(
48000
,
HERTZ_FORMAT
);
// 48000Hzで呼び出し
Timer1
.
setOverflow
(
AS_SYS_SAMPLERATE
,
HERTZ_FORMAT
);
//サンプルレートHzでよびだす
Timer1
.
attachInterrupt
(
// 割り込みハンドラの登録
audioreader
// 呼び出す関数
);
...
...
@@ -43,13 +76,42 @@ void setup() {
Timer1
.
refresh
();
// タイマ更新
Timer1
.
resume
();
// タイマースタート
tone
(
PB4
,
200
);
analogWrite
(
biasPin
,
2482
);
analogWrite
(
biasPin
,
AUDIO_BIAS
);
anc_state
=
ANC
.
IDENTIFICAT_COEFC
;
}
// the loop function runs over and over again forever
void
loop
()
{
if
(
sendTimingCnt
>=
2000
){
//デバグ情報の送信
if
(
sendTimingCnt
>=
AS_SYS_SAMPLERATE
/
4
){
sendDebugdat
();
sendTimingCnt
=
0
;
}
//ANC状態の管理
if
(
anc_state
==
ANC
.
IDENTIFICAT_COEFC
)
{
t1
=
micros
();
//伝達関数の推定をしている。非同期処理なのでタイミングがずれるかも
if
(
calocReadyFlg
){
ANC
.
calc2ndPassTF
(
audioInValue
-
AUDIO_BIAS
,
audioOutValue
);
audioOutValue
=
s_sound
.
playWaveCharp
(
s_sound
.
UNSINGED_INT_WAVE
);
calocReadyFlg
=
false
;
}
t2
=
micros
();
printf
(
" t=%d
\n
"
,
t2
-
t1
);
//起動から15sでモード移行 正確に処理したい場合はタイマーを使おう!
if
(
millis
()
>
15
*
1000
)
{
ANC
.
printCoefC
();
anc_state
=
ANC
.
ACTIVATION_ANC
;
}
}
else
if
(
anc_state
==
ANC
.
ACTIVATION_ANC
)
{
audioOutValue
=
0
;
}
}
ws.code-workspace
View file @
576cd3b4
...
...
@@ -10,5 +10,11 @@
"path": "..\\IMC_ANC_test"
}
],
"settings": {}
"settings": {
"files.associations": {
"xiosbase": "cpp",
"xlocale": "cpp",
"ios": "cpp"
}
}
}
\ No newline at end of file
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment