Wzmacniacz gitarowy
Prezentacja druga
Praca
Dyplomowa
2 z 11
Cel Projektu
Zaprojektowad urządzenie elektroniczne
pozwalające wzmocnid sygnał z gitary
elektrycznej, przetworzyd go i podad na
zewnętrzny głośnik.
3 z 11
Moduł 4 Efekty
• C2000 32-bit Real-time CPU Peripheral Kit
4 z 11
Efekt opóźniający
• Echo – jedna przeszkoda, filtr I rzędu, SOI lub
NOI
• Pogłos – wiele przeszkód, kilka filtrów
połączonych równolegle
• Flanger – wartośd opóźnienia = sinus(f)
• Vibrato – flanger bez oryginalnego sygnału
• Chór – wartośd opóźnienia = zmienna losowa
5 z 11
Pogłos – Implementacja programowa
short Filter_comb(short delay_in_sample,
int
mode,short
*
buf,
int
*
pointer,
int
table_size)
{
short delay_out_sample;
float
BL
=
0
;
float
FB
=
0
;
float
FF
=
0
;
// filtr FIR
if
(mode
==
0
)
{
BL
=
1
;
FB
=
0
;
FF
=
adc_value2
/
ADC_MAX;
}
// Filtr IIR
else
if
(mode
==
1
)
...
// Filtr ALLPASS
else
if
(mode
==
2
)
...
// obliczenie równania różnicowego filtru uniwersalnego
if
(
*
pointer
+
1
>
=
table_size)
{
delay_out_sample
=
BL
*
(delay_in_sample
+
FB
*
buf[
*
pointer
+
1
-
table_size])
+
FF
*
buf[
*
pointer
+
1
-
table_size];
buf[
*
pointer]
=
delay_in_sample
+
FB
*
buf[
*
pointer
+
1
-
table_size];
}
else
{
delay_out_sample
=
BL
*
(delay_in_sample
+
FB
*
buf[
*
pointer
+
1
])
+
FF
*
buf[
*
pointer
+
1
];
buf[
*
pointer]
=
delay_in_sample
+
FB
*
buf[
*
pointer
+
1
];
}
pointer
++
;
// inkrementacja wskaźnika aktualnej pozycji w buforze
if
(
*
pointer
==
table_size)
*
pointer
=
0
;
return
delay_out_sample;
}
short
Reverb
(short sample_in)
{
short sample_out;
//obliczenie wczesnych odbić za pomocą filtrów grzebieniowych
sample_out=0.25*
Filter_comb
(sample_in,1,buf_delay1,&head_1, BUF_SIZE1)
+0.25*
Filter_comb
(sample_in,1,buf_delay2,&head_2, BUF_SIZE2)
+0.25*
Filter_comb
(sample_in,1,buf_delay3,&head_3, BUF_SIZE3)
+0.25*
Filter_comb
(sample_in,1,buf_delay4,&head_4, BUF_SIZE4);
// obliczenie ogona pogłosowego
sample_out=
Filter_comb
(sample_out,2,buf_delay5,&head_5, BUF_SIZE5);
sample_out=0.5*sample_in+0.5*
Filter_comb
(sample_out,2,buf_delay6,&head_6,BUF_SIZE5);
return sample_out;
}
6 z 11
Inne – Implementacja programowa
short Delay_effect(short delay_in_sample, type_delay mode)
{
short delay_out_sample;
...
unsigned
int
delay_change;
if
(mode
!=
OFF)
{
// wybór efektu, ustawienie odpowiednich parametrów filtru uniwersalnego
if
(mode
==
ECHO)
{
//ustawienie parametrów filtru uniwersalnego
BL
=
1
;
FF
=
0
;
FB
=
0.75
*
adc_value2
/
ADC_MAX;
delay_change
=
(
int
)((adc_value1
+
100
)
/
100
);
}
else
if
(mode
==
VIBRATO)
{
...
flanging_freq
=
(
9
*
adc_value2
/
ADC_MAX
+
1
)
*
0.5
;
//0.5 - 5Hz
flanging_range
=
(
int
)(
100.0
*
adc_value1
/
ADC_MAX)
/
10
;
//zakres 110-220 (5ms-10ms)
delay_change
=
(
int
)(BUF_SIZE
-
10
-
((
sin
(
2
*
M_PI
*
del_count
*
flanging_freq
/
22050
)
+
1
)
/
2
)
*
flanging_range);
del_count
++
;
if
(del_count >
=
22050
/
flanging_freq) del_count
=
0
;
}
else
if
(mode
==
FLANGER)
{
...
}
else
if
(mode
==
CHORUS)
{
//ustawienie parametrów filtru uniwersalnego
...
if
(chorus_flag_up
==
TRUE)
{
rand_value
=
rand_value
+
(((double)(
rand
()
%
100
)
/
20000000
)
+
0.000005
);
}
else
rand_value
=
rand_value
-
(((double)(
rand
()
%
100
)
/
20000000
)
+
0.000005
);
//ograniczenie wartości rand_value od 0 do 1
if
(rand_value>
1
)
{
chorus_flag_up
=
FALSE;
rand_value
=
1
;
}
if
(rand_value<
=
0
)
{
chorus_flag_up
=
TRUE;
rand_value
=
0
;
}
delay_change
=
(
int
)BUF_SIZE
-
20
-
rand_value
*
flanging_range;
}
// oblieczenie równania różnicowego filtru uniwersalnego
delay_out_sample
=
BL
*
(delay_in_sample
+
FB
*
buf_delay[head
+
delay_change])
+
FF
*
buf_delay[head
+
delay_change];
...
}
else
return
delay_in_sample;
return
delay_out_sample;
}
7 z 11
Efekty modulujące
• Tremolo –Modulacja amplitudy za pomocą
sygnału sinusoidalnego. Częstotliwośd do 20Hz
• Ring modulator –Modulacja amplitudy za
pomocą sygnału sinusoidalnego. Częstotliwośd
kilka kHz.
Modulacja amplitudowa – w tym przypadku
wymnożenie próbek obu sygnałów
8 z 11
Efekty Modulujące
implementacja programowa
short Tremolo(short sample_in)
{
short sample_out;
float
volume;
float
volume_freq
=
14
*
adc_value2
/
ADC_MAX
+
0.2
;
// częstotliwość modulacji od 0.2 do 14.2 Hz
float
volume_range
=
(
float
)adc_value1
/
ADC_MAX;
// głębokość modulacji od 0 do 1
volume
=
((
sin
(
2
*
M_PI
*
del_count
*
volume_freq
/
22050
)
+
1
)
/
2
)
*
volume_range
+
(
1
-
volume_range);
del_count
++
;
if
(del_count >
=
22050
/
volume_freq) del_count
=
0
;
sample_out
=
sample_in
*
volume;
return
sample_out;
}
short RingModulator(short sample_in, short mode)
{
short sample_out;
float
mod;
float
freq;
int
freq_shift
=
980
*
((
float
)(adc_value1)
/
ADC_MAX)
+
20
;
// f sterowania obwiednią
if
(mode
==
0
) freq
=
max
/
3
+
freq_shift;
else
if
(mode
==
1
) freq
=
790
*
((
float
)(adc_value2)
/
ADC_MAX)
+
10
;
mod
=
sin
(
2
*
M_PI
*
del_count
*
freq
/
22050
);
// obliczenie sinusoidy modulującej
del_count
++
;
if
(del_count >
=
22050
/
freq) del_count
=
0
;
sample_out
=
sample_in
*
mod;
// wymnożenie sygnału wejściowego razy próbke sinusoidy
return
sample_out;
}
9 z 11
Przester
Przester – kolokwialne określenie efektu
nasycenia wzmacniacza.
• Distortion – klasyczny przester
• Overdrive – algorytm Overdrive’a. Wydzielenie
kilku poziomów mocy sygnału.
10 z 11
Distortion – Implementacja
programowa
short Distortion(short sample_in, short distortion_type)
{
float
gain
=
(
4
*
(
float
)adc_value1
/
ADC_MAX)
+
1
;
if
(distortion_type
==
1
)
{
sample_in
=
sample_in
*
gain;
if
(sample_in > LEVEL) sample_in
=
LEVEL;
else
if
(sample_in<
-
LEVEL) sample_in
=
-
LEVEL;
}
else
if
(distortion_type
==
2
)
...
else
if
(distortion_type
==
6
)
{
if
(sample_in <
0
) sample_in
=
sample_in
*
gain;
if
(sample_in <
-
LEVEL) sample_in
=
-
LEVEL
-
sample_in ;
}
else
if
( distortion_type
==
7
)
//fuzz
{
sample_in
=
sample_in
*
gain;
if
(sample_in > LEVEL
/
5
)sample_in
=
LEVEL
/
5
;
else
if
(sample_in <
-
2
*
LEVEL) sample_in
=-
2
*
LEVEL;
}
else
sample_in
=
sample_in;
return
sample_in;
}
11 z 11
Dziękuję za uwagę
Krzysztof Jóźwiak
179767