Advertisement
Guest User

Untitled

a guest
Jun 20th, 2019
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.77 KB | None | 0 0
  1. - libsndfile for opening and reading the wav file
  2. - libportaudio for audio playback
  3. - FFTW3 for performing the FFT of each chunk of audio stream
  4. - libboost for IPC
  5.  
  6. typedef struct FFTW_Point {
  7. int x_val;
  8. float y_val;
  9. } FFTW_Point;
  10.  
  11. static int pa_callback(
  12. const void *input,
  13. void *output,
  14. unsigned long frameCount,
  15. const PaStreamCallbackTimeInfo *timeInfo,
  16. PaStreamCallbackFlags statusFlags,
  17. void *userData
  18. ) {
  19. float *out;
  20. snd_data *p_data = (snd_data*)userData;
  21. sf_count_t num_read;
  22.  
  23. out = (float*)output;
  24. p_data = (snd_data*)userData;
  25.  
  26. memset(out, 0, sizeof(float) * frameCount * p_data->info.channels);
  27. num_read = sf_read_float(p_data->file, out, frameCount * p_data->info.channels);
  28.  
  29. if ((long unsigned int) num_read < frameCount)
  30. {
  31. fftw->setNumSamples(num_read);
  32. fftw->loadInputData(out);
  33. //fftw->writeWav();
  34. return paComplete;
  35. }
  36. fftw->loadInputData(out);
  37. return paContinue;
  38. }
  39.  
  40. inline static double hannWindow(float value, int i, unsigned int size) {
  41. return value * (0.5 * (1 - cos(2*M_PI*i/(size))));
  42. }
  43.  
  44. void FFTW_Tool::loadInputData(float* buffer) {
  45. for (size_t i = 0; i < numSamples; ++i) {
  46. in[i][0] = hannWindow(buffer[i], i, numSamples);
  47. in[i][1] = 0;
  48. }
  49. StartFFTW();
  50. }
  51.  
  52. void FFTW_Tool::executePlan(const unsigned int numSamples,
  53. const int direction,
  54. const unsigned int calculationType) {
  55.  
  56. fftw_plan plan = fftw_plan_dft_1d(
  57. numSamples,
  58. in,
  59. out,
  60. direction,
  61. calculationType
  62. );
  63.  
  64. fftw_execute(plan);
  65. //shm_region.flush();
  66. //outputSize = numSamples/2
  67. for (size_t i = 0; i < outputSize; ++i) {
  68. sharedStruct[i].x_val = i * samplingFreq / numSamples;
  69. auto real = out[i][0];
  70. auto img = out[i][1];
  71. auto mag = complexModule(real, img);
  72. auto amp = (2*mag)/numSamples;
  73. sharedStruct[i].y_val = amp;
  74. }
  75.  
  76. fftw_destroy_plan(plan);
  77. std::memcpy(shm_region.get_address(), sharedStruct, (sizeof(FFTW_Point) * outputSize));
  78.  
  79. }
  80.  
  81. def update(self):
  82. shmem = mmap.mmap(fd, 0, access=mmap.ACCESS_READ)
  83. xs = []
  84. ys = []
  85. for i1, i2, i3, i4, f1, f2, f3, f4 in zip(*[iter(shmem)]*8):
  86. x_val = struct.unpack('i', i1+i2+i3+i4)[0]
  87. y_val = struct.unpack('f', f1+f2+f3+f4)[0]
  88. xs.append(x_val)
  89. ys.append(20*np.log10(y_val))
  90. #ys.append(y_val)
  91. self.set_plotdata(name='spectrum', data_x=xs, data_y=ys)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement