Advertisement
Guest User

smiw_phaser

a guest
Nov 20th, 2019
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.46 KB | None | 0 0
  1. #include "Talkthrough.h"
  2. #include <math.h>
  3.  
  4. //--------------------------------------------------------------------------//
  5. // Function:    Process_Data()                                              //
  6. //                                                                          //
  7. // Description: This function is called from inside the SPORT0 ISR every    //
  8. //              time a complete audio frame has been received. The new      //
  9. //              input samples can be found in the variables iChannel0LeftIn,//
  10. //              iChannel0RightIn, iChannel1LeftIn and iChannel1RightIn      //
  11. //              respectively. The processed data should be stored in        //
  12. //              iChannel0LeftOut, iChannel0RightOut, iChannel1LeftOut,      //
  13. //              iChannel1RightOut, iChannel2LeftOut and iChannel2RightOut   //
  14. //              respectively.                                               //
  15. //--------------------------------------------------------------------------//
  16.  
  17. //**************************************************//
  18. //                                                  //
  19. //                      PHASER                      //
  20. //                                                  //
  21. //=====================SETTINGS=====================//
  22. //                                                  //
  23. // Współczynnik sprzężenia zwrotnego 0..1           //
  24. #define FEEDBACK 0.6f                               //
  25. // Dolna częstotliwość zakresu opóźnianego.            //
  26. #define F_MIN 440.0f                                //
  27. // Górna częstotliwość zakresu opóźnianego.           //
  28. #define F_MAX 1100.0f                               //
  29. // Współczynnik szybkość zmiany opóźnienia 0..1.  //
  30. #define RATE 0.5f                                   //
  31. // Częstotliwość próbkowania sygnału.              //
  32. #define FS 44100.0f                                 //
  33. //                                                  //
  34. //==================================================//
  35.  
  36. // !!! Do piszącego spr -> coś naściemniać z https://en.wikipedia.org/wiki/Phaser_(effect)
  37.  
  38. #define PI 3.14f
  39.  
  40. // Minimalna wartość współczynnika opóźniającego.
  41. #define D_MIN (F_MIN / FS / 2.0)
  42. // Maksymalna wartość współczynnkia opóźniającego.
  43. #define D_MAX (F_MAX / FS / 2.0)
  44. // Współczynnik ikrementacji fazy sygnału LFO (Low-frequency Oscillation).
  45. #define LFO_INC (2.0 * PI * RATE / FS)
  46. // Wpółczynnik udziału próbki przetworzonej w sumie sygnału wyjściowego 0..1.
  47. #define DEPTH 1.0f
  48.  
  49. #define BUFF_SIZE 98200
  50.  
  51. float lfoPhase = 0;
  52. float delay1 = 0;
  53.  
  54. int zm1 = 0;
  55. int AllpassDelay[6] = { 0 };
  56. int buffRaw[BUFF_SIZE] = { 0 };
  57. int buffPost[BUFF_SIZE] = { 0 };
  58. int ite = 0;
  59.  
  60. // Filtr wszechprzepustowy wprowadzający opóźnienie.
  61. // Opóźnienie sygnału (fazy sygnału) zmienne wraz ze zmianą zmiennej delay1.
  62. // W zależności od wartości opóźnienia wpływa również na amplitudę sygnału [Wykres 1 i 2].
  63. int AllpassDelayUpdate(int id, int inSamp) {
  64.     int y1;
  65.     y1 = (int)((float)inSamp * -1.0 * delay1) + AllpassDelay[id];
  66.     AllpassDelay[id] = (int)((float)(y1 * delay1)) + inSamp;
  67.     return y1;
  68. }
  69.  
  70. // Ustawienie opóźnienia dla filtra, normalizacja wartości.
  71. void setDelay(float d) {
  72.     delay1 = (1.0f - d) / (1.0f + d);
  73. }
  74.  
  75. void Process_Data(void)
  76. {
  77.     int sampleLeft = iChannel0LeftIn << 8;
  78.     int sampleRight = iChannel0RightIn << 8;
  79.     int sample = (sampleLeft + sampleRight) / 2;
  80.  
  81.     //student's code here
  82.  
  83.     buffRaw[ite] = sample;
  84.  
  85.     // !!! Do piszącego spr -> coś naściemniać z https://en.wikipedia.org/wiki/Low-frequency_oscillation
  86.     // Wyznaczenie zmiennego opóźnienia dla filtru. Zmienne opóźnienie dzięki LFO(Low-frequency oscillation).
  87.     float d = D_MIN + (D_MAX - D_MIN) * ((sin(lfoPhase) + 1.0f) / 2.0f);
  88.  
  89.     // Ikrementacja fazy współczynnika dla LFO.
  90.     lfoPhase += LFO_INC;
  91.  
  92.     if (lfoPhase >= PI * 2.0f) {
  93.         lfoPhase -= PI * 2.0f;
  94.     }
  95.  
  96.     // Ustawianie opóźnienia dla filtów wszechprzepustowych.
  97.     setDelay(d);
  98.  
  99.     // Sześć szeregowo połączonych filtów wszechprzepustowych.
  100.     int y2;
  101.     y2 = AllpassDelayUpdate(0,
  102.         AllpassDelayUpdate(1,
  103.             AllpassDelayUpdate(2,
  104.                 AllpassDelayUpdate(3,
  105.                     AllpassDelayUpdate(4,
  106.                         AllpassDelayUpdate(5,
  107.                         (sample + (int)((float)zm1 * FEEDBACK)) // Suma bierzącej próbki i poprzedniej.
  108.                         )
  109.                     )
  110.                 )
  111.             )
  112.         )
  113.     );
  114.  
  115.     zm1 = y2;
  116.     // Próbka wyjściowa jako suma oryginalnej i przetowrzonej.
  117.     sample = (sample + (int)((float)y2 * DEPTH)) / 2;
  118.  
  119.     buffPost[ite] = sample;
  120.     ++ite;
  121.     ite %= BUFF_SIZE;
  122.  
  123.     //post-processing
  124.     sample = sample >> 8;
  125.     iChannel0LeftOut = sample;
  126.     iChannel0RightOut = sample;
  127. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement