display spectrum
This commit is contained in:
parent
f28c0965ec
commit
020469d1a2
26
main.cpp
26
main.cpp
|
@ -5,6 +5,7 @@
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <complex>
|
||||||
|
|
||||||
#include <GLFW/glfw3.h>
|
#include <GLFW/glfw3.h>
|
||||||
|
|
||||||
|
@ -27,18 +28,35 @@ static int waterfall_height = 700;
|
||||||
static unsigned int waterfall_data[1600*700];
|
static unsigned int waterfall_data[1600*700];
|
||||||
|
|
||||||
static void dsp_thread() {
|
static void dsp_thread() {
|
||||||
std::vector<short int> frames(6400);
|
size_t len = 6400;
|
||||||
|
std::vector<short int> frames(len);
|
||||||
|
|
||||||
|
std::vector<float> frames_f(len);
|
||||||
|
pocketfft::shape_t shape{len};
|
||||||
|
pocketfft::stride_t stride(shape.size());
|
||||||
|
size_t tmp=sizeof(float);
|
||||||
|
for (int i=shape.size()-1; i>=0; --i) {
|
||||||
|
stride[i] = tmp;
|
||||||
|
tmp *= shape[i];
|
||||||
|
};
|
||||||
|
pocketfft::shape_t axes;
|
||||||
|
for(size_t i=0; i<shape.size(); ++i)
|
||||||
|
axes.push_back(i);
|
||||||
|
std::vector<std::complex<float>> frames_ft(len);
|
||||||
while(!terminate_dsp) {
|
while(!terminate_dsp) {
|
||||||
int read_count = snd_pcm_readi(pcm, frames.data(), 6400);
|
int read_count = snd_pcm_readi(pcm, frames.data(), len);
|
||||||
if(read_count < 0) {
|
if(read_count < 0) {
|
||||||
std::cerr << "read from audio interface failed: " << snd_strerror(read_count) << std::endl;
|
std::cerr << "read from audio interface failed: " << snd_strerror(read_count) << std::endl;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
for(size_t i=0;i<len;i++)
|
||||||
|
frames_f[i] = frames[i];
|
||||||
|
pocketfft::r2c(shape, stride, stride, axes, true, frames_f.data(), frames_ft.data(), 1.0f);
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> guard(waterfall_data_mutex);
|
std::lock_guard<std::mutex> guard(waterfall_data_mutex);
|
||||||
std::memmove(&waterfall_data[waterfall_width], &waterfall_data[0], 4*waterfall_width*(waterfall_height - 1));
|
std::memmove(&waterfall_data[waterfall_width], &waterfall_data[0], sizeof(int)*waterfall_width*(waterfall_height - 1));
|
||||||
for(int i=0;i<waterfall_width;i++) {
|
for(int i=0;i<waterfall_width;i++) {
|
||||||
waterfall_data[i] = 0xff000000 | 0x010101*(frames[i*read_count/waterfall_width]/256 + 128);
|
waterfall_data[i] = 0xff000000 | 0x010101*std::min(int(abs(frames_ft[i*len/(4*waterfall_width)])/10000.), 255);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue