Skip to content

Commit 9eff463

Browse files
committed
FFT remove shiftValues
1 parent db51fa3 commit 9eff463

File tree

5 files changed

+89
-29
lines changed

5 files changed

+89
-29
lines changed
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
/**
2+
* @file streams-url_fft_up-audiokit.ino
3+
* @author Phil Schatzmann
4+
* @brief Using FFT to shift frequency up quite a bit
5+
* @version 0.1
6+
* @date 2022-06-28
7+
*
8+
* @copyright Copyright (c) 2022
9+
*
10+
*/
11+
12+
#include "AudioTools.h"
13+
#include "AudioLibs/AudioKit.h"
14+
#include "AudioCodecs/CodecMP3Helix.h"
15+
#include "AudioLibs/AudioRealFFT.h" // or AudioKissFFT
16+
17+
URLStream url("SSID","PWD");
18+
AudioKitStream kit;
19+
AudioRealFFT fft;
20+
ChannelFormatConverterStream cf(fft);
21+
EncodedAudioStream dec(&cf, new MP3DecoderHelix()); // Decoding stream
22+
StreamCopy copier(dec, cf); // copy mic to tfl
23+
int channels = 2;
24+
int samples_per_second = 44100;
25+
int bits_per_sample = 16;
26+
float value=0;
27+
28+
// process fft result
29+
void fftResult(AudioFFTBase &bfft){
30+
// get result components
31+
float* real = fft.realArray();
32+
float* img = fft.imgArray();
33+
// increase frequencies by n bins
34+
int n = 0;
35+
//fft.shiftValues(real, n);
36+
//fft.shiftValues(img, n);
37+
// invert fft with updated values
38+
float *result = fft.ifft(real, img);
39+
40+
// output audio
41+
int16_t samples[2];
42+
for (int j=0;j<fft.length();j++){
43+
//Serial.println(result[j]);
44+
samples[0] = result[j]; // channel 0
45+
samples[1] = result[j]; // channel 1
46+
kit.write((uint8_t*)&samples, sizeof(samples));
47+
}
48+
}
49+
50+
void setup() {
51+
Serial.begin(115200);
52+
AudioLogger::instance().begin(Serial, AudioLogger::Info);
53+
54+
// setup Audiokit
55+
auto cfg = kit.defaultConfig(TX_MODE);
56+
cfg.channels = channels;
57+
cfg.sample_rate = samples_per_second;
58+
cfg.bits_per_sample = bits_per_sample;
59+
kit.begin(cfg);
60+
kit.setVolume(1.0);
61+
62+
// Setup FFT
63+
auto tcfg = fft.defaultConfig();
64+
tcfg.length = 1024;
65+
tcfg.channels = channels;
66+
tcfg.sample_rate = samples_per_second;
67+
tcfg.bits_per_sample = bits_per_sample;
68+
tcfg.callback = &fftResult;
69+
fft.begin(tcfg);
70+
71+
copier.setCheckAvailableForWrite(false);
72+
// mp3 radio
73+
url.begin("https://stream.live.vc.bbcmedia.co.uk/bbc_world_service","audio/mp3");
74+
75+
// convert 2 to 1 channel
76+
cf.begin(2,1);
77+
78+
// initialize decoder
79+
dec.begin();
80+
81+
}
82+
83+
void loop() {
84+
copier.copy();
85+
}

src/AudioLibs/AudioFFT.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ struct AudioFFTResult {
2626
}
2727
};
2828

29-
/// Configuration for AudioFFT
29+
/// Configuration for AudioFFT. If there are more then 1 channel the channel_used is defining which channel is used to perform the fft on.
3030
struct AudioFFTConfig : public AudioBaseInfo {
3131
AudioFFTConfig(){
3232
channels = 2;
@@ -59,7 +59,7 @@ class FFTDriver {
5959
};
6060

6161
/**
62-
* @brief Executes FFT using audio data. The Driver which is passed in the constructor selects a specifc FFT implementation
62+
* @brief Executes FFT using audio data. The Driver which is passed in the constructor selects a specifc FFT implementation.
6363
* @author Phil Schatzmann
6464
* @copyright GPLv3
6565
*/

src/AudioLibs/AudioRealFFT.h

Lines changed: 1 addition & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -68,36 +68,11 @@ class AudioRealFFT : public AudioFFTBase {
6868
float* ifft(float *real, float* complex){
6969
// update mirrored values
7070
int len = length();
71-
for (int j=0;j<size();j++){
72-
real[len-j] = real[j];
73-
complex[len-j] = complex[j];
74-
}
7571
static_cast<FFTDriverRealFFT*>(driver())->p_fft_object->do_ifft(real, complex);
7672
return real;
7773
}
7874

79-
/// Shift the values in the array up or down
80-
void shiftValues(float *values, int n){
81-
if (n>0){
82-
// shift values up
83-
for (int j=n;j<size();j++){
84-
values[j]=values[j-n];
85-
}
86-
// clear beginning
87-
for (int j=0;j<n;j++){
88-
values[j]=0;
89-
}
90-
} else {
91-
// shift values down
92-
for (int j=size();j>=0;j--){
93-
values[j+n]=values[j];
94-
}
95-
// clear end
96-
for (int j=0;j<abs(n);j++){
97-
values[size()-j]=0;
98-
}
99-
}
100-
}
75+
10176

10277
FFTDriverRealFFT* driverEx() {
10378
return (FFTDriverRealFFT*)driver();

src/AudioTools/AudioStreamsConverter.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class ChannelFormatConverterStreamT : public AudioStreamX {
3333

3434
virtual size_t write(const uint8_t *data, size_t size) override {
3535
if (from_channels==to_channels){
36-
return p_stream->write(data, size);
36+
return p_print->write(data, size);
3737
}
3838
size_t resultBytes = convert(data, size);
3939
assert(resultBytes = factor*size);

0 commit comments

Comments
 (0)