Advertisement
Guest User

Untitled

a guest
Mar 20th, 2023
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.11 KB | None | 0 0
  1. #include <iostream>
  2. #include <alsa/asoundlib.h>
  3. #include <cmath>
  4. #include <random>
  5.  
  6. constexpr int rate = 44100;
  7.  
  8. int main()
  9. {
  10.     int err;
  11.     snd_pcm_t *handle;
  12.     snd_pcm_sframes_t frames;
  13.  
  14.      if ((err = snd_pcm_open(&handle, "default", SND_PCM_STREAM_PLAYBACK, SND_PCM_ASYNC)) < 0) {
  15.         printf("Playback open error: %s\n", snd_strerror(err));
  16.         exit(EXIT_FAILURE);
  17.     }
  18.  
  19.      if ((err = snd_pcm_set_params(handle,
  20.                       SND_PCM_FORMAT_FLOAT,
  21.                       SND_PCM_ACCESS_RW_INTERLEAVED,
  22.                       1,
  23.                       rate,
  24.                       0,
  25.                       50000)) < 0) {  
  26.         printf("Playback open error: %s\n", snd_strerror(err));
  27.         exit(EXIT_FAILURE);
  28.     }
  29.  
  30.     std::random_device rd;
  31.     std::mt19937 gen(rd());
  32.     std::uniform_real_distribution<float> distrib(-1.0f, 1.0f);
  33.  
  34.     constexpr int buf_len = rate * 3;
  35.     float* in = new float[buf_len];
  36.     float* out = new float[buf_len]();
  37.    
  38.     constexpr int M = 200;
  39.     float fc = 2100.0f / rate;
  40.     double h[M + 1]{0.0f};
  41.  
  42.     for (int i = 0; i < buf_len; i++)
  43.     {
  44.         in[i] = distrib(gen);
  45.     }  
  46.  
  47.     for (int i = 0; i <= M; i++)
  48.     {
  49.         if ((i - M/2) == 0)
  50.         {
  51.             h[i] = 2*M_PI*fc;
  52.         }
  53.         else
  54.         {
  55.             h[i] = std::sin(2.0*M_PI*fc*(i - M/2)) / (i - M/2);
  56.         }
  57.         h[i] *= 0.42 - 0.5 * std::cos((2.0*M_PI*i)/M) + 0.08 * std::cos((4.0*M_PI*i)/M);
  58.     }
  59.  
  60.     double sum = 0;
  61.     for (int i = 0; i <= M; i++)
  62.     {
  63.         sum += h[i];
  64.     }
  65.     for (int i = 0; i <= M; i++)
  66.     {
  67.         h[i] /= sum;
  68.     }
  69.  
  70.     //change to high pass
  71.     for (int i = 0; i <= M; i++)
  72.     {
  73.         h[i] *= -1.0;
  74.     }
  75.     h[M/2] += 1.0f;
  76.  
  77.     // Convolve
  78.     for (int i = M; i < buf_len; i++)
  79.     {
  80.         for (int j = 0; j <= M; j++)
  81.         {
  82.             out[i] += in[i - j] * h[j];
  83.         }
  84.     }
  85.  
  86.     frames = snd_pcm_writei(handle, out, buf_len);
  87.     if (frames < 0)
  88.     {
  89.         frames = snd_pcm_recover(handle, frames, 0);
  90.     }
  91.  
  92.     snd_pcm_drain(handle);
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement