Advertisement
Guest User

Untitled

a guest
Nov 19th, 2019
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.99 KB | None | 0 0
  1. #include <stdio.h>
  2. #include<math.h>
  3. #include<stdlib.h>
  4. #include<string.h>
  5.  
  6.  
  7. #define PI 3.14159265
  8. #define OKRES_PROBKOWANIA_s 0.000001 //10Hz
  9. #define ILOSC_PROBEK 10000
  10. #define PREDKOSC_DZWIEKU_m_s 340 //Predkosc dziwieku 340 m/s
  11. #define LICZBA_KATOW 181 //Liczba kątów odpowiadająca ilosci iteracji
  12.  
  13.  
  14. double mikrofon1[ILOSC_PROBEK]={0};
  15. double mikrofon2[ILOSC_PROBEK]={0};
  16. double mikrofon3[ILOSC_PROBEK]={0};
  17. double mikrofon4[ILOSC_PROBEK]={0};
  18. double opoznienia_mikrofon1[LICZBA_KATOW];
  19. double opoznienia_mikrofon2[LICZBA_KATOW];
  20. double opoznienia_mikrofon3[LICZBA_KATOW];
  21. double opoznienia_mikrofon4[LICZBA_KATOW];
  22.  
  23.  
  24. void print(double sig[], char* nazwa )//zapisuje do pliku sygnał o
  25. {
  26.  
  27.  
  28. FILE *fp;
  29. char* rozwiniecie = ".dat";
  30. char fileSpec[strlen(nazwa)+strlen(rozwiniecie)+1];
  31.  
  32. snprintf( fileSpec, sizeof( fileSpec ), "%s%s", nazwa, rozwiniecie );
  33. fp = fopen (fileSpec,"w");
  34.  
  35. for(int i=0;i<ILOSC_PROBEK;i++)
  36. {
  37. fprintf(fp,"%d %f\n",i,sig[i]);
  38. }
  39. }
  40.  
  41. void print_max(double sig[])//zapisuje do pliku.dat maksima korelacji dla każdego z kątów
  42. {
  43. FILE *fp;
  44. fp = fopen ("max.dat","w");
  45.  
  46. for(int i=0;i<181;i++)
  47. {
  48. fprintf(fp,"%d %f\n",i,sig[i]);
  49. }
  50. }
  51.  
  52. void Symuluj(double mic[], int delay, int szum_delay) //funkcja tworząca sygnał do symulacji
  53. {
  54. for(int i=0;i<delay;i++)
  55. {
  56. mic[i] = 0;
  57. }
  58. for(int i=delay;i<1000+delay;i++)
  59. {
  60. mic[i]=i-delay;
  61. }
  62. for(int i=1000+delay;i<2000+delay;i++)
  63. {
  64. mic[i]=2000+delay-i;
  65. }
  66. for(int i=2000+delay;i<5000;i++)
  67. {
  68. mic[i]=0;
  69. }
  70. for(int i=5000;i<5500;i++)
  71. {
  72. mic[i]=i-5000;
  73. }
  74. for(int i=5000+szum_delay;i<5500+szum_delay;i++)
  75. {
  76. mic[i]=i-szum_delay-5000;
  77. }
  78. for(int i=5500+szum_delay;i<6000+szum_delay;i++)
  79. {
  80. mic[i]=6000+szum_delay-i;
  81. }
  82. for(int i=6000+szum_delay;i<ILOSC_PROBEK;i++)
  83. {
  84. mic[i]=0;
  85. }
  86. }
  87.  
  88. double DegToRad(int kat) //konwersja stopni na radiany
  89. {
  90.  
  91. double przelicznik= PI/180;
  92.  
  93. return kat*przelicznik;
  94.  
  95. }
  96. int Count_Delay() //obliczanie opóżnień dla mikrofonów względem mic1
  97. {
  98.  
  99.  
  100.  
  101. for(int i=0, stopnie=-90; i<181 && stopnie<91 ;i++,stopnie++)
  102. {
  103.  
  104. opoznienia_mikrofon2[i]=(0.02*sin(DegToRad(stopnie)))/PREDKOSC_DZWIEKU_m_s;
  105. opoznienia_mikrofon3[i]=(0.04*sin(DegToRad(stopnie)))/PREDKOSC_DZWIEKU_m_s;
  106. opoznienia_mikrofon4[i]=(0.06*sin(DegToRad(stopnie)))/PREDKOSC_DZWIEKU_m_s;
  107.  
  108. }
  109. for(int i=0;i<181;i++)
  110. {
  111. //printf("%d\n",i );
  112. //printf("%lf\n",opoznienia_mikrofon2[i] );
  113. }
  114. return 0;
  115. }
  116.  
  117. double Determinate_Singal( double Sig[ILOSC_PROBEK], double t, double tdelay,
  118. double OkresProbkowania_s)
  119. {
  120. if (t<tdelay) return 0;
  121.  
  122. int Idx= floor((t-tdelay)/OkresProbkowania_s);
  123. double S=Sig[Idx];
  124. if (Idx>=ILOSC_PROBEK) return 0;
  125.  
  126.  
  127. return (((Sig[Idx+1]-Sig[Idx])/OkresProbkowania_s)
  128. *((t-tdelay)-Idx*OkresProbkowania_s))+Sig[Idx];
  129.  
  130. }
  131.  
  132. double Beamforming(int argument)
  133. {
  134.  
  135. double czas;
  136. double bufor[180]; //bufor przechowujący rozwiazania dla kazdej iteracji
  137. double sygnal1, sygnal2, sygnal3, sygnal4, suma_sygnalow;
  138. double maksimum_korelacji=0;
  139. int kat_sygnalu=0;
  140. printf("%d",argument);
  141. for(int i=0;i<181;i++)
  142. {
  143.  
  144. if (argument==116) maksimum_korelacji = -2147483648; //Zerowanie zmiennej do rysowania wykresu maksimum
  145. double opoznienie_mikrofon1_s=0;
  146. double opoznienie_mikrofon2_s=opoznienia_mikrofon2[i];
  147. double opoznienie_mikrofon3_s=opoznienia_mikrofon3[i];
  148. double opoznienie_mikrofon4_s=opoznienia_mikrofon4[i];
  149.  
  150.  
  151. for(int indeks=0;indeks<ILOSC_PROBEK;indeks++)
  152. {
  153. czas=indeks*OKRES_PROBKOWANIA_s;
  154. sygnal1=Determinate_Singal(mikrofon1,czas,opoznienie_mikrofon1_s,OKRES_PROBKOWANIA_s);
  155. sygnal2=Determinate_Singal(mikrofon2,czas,opoznienie_mikrofon2_s,OKRES_PROBKOWANIA_s);
  156. sygnal3=Determinate_Singal(mikrofon3,czas,opoznienie_mikrofon3_s,OKRES_PROBKOWANIA_s);
  157. sygnal4=Determinate_Singal(mikrofon4,czas,opoznienie_mikrofon4_s,OKRES_PROBKOWANIA_s);
  158. suma_sygnalow= sygnal1+sygnal2+sygnal3+sygnal4;
  159.  
  160. if (maksimum_korelacji<suma_sygnalow)
  161. {
  162. maksimum_korelacji=suma_sygnalow;
  163. kat_sygnalu=i;
  164. }
  165.  
  166. }
  167. bufor[i]=maksimum_korelacji;
  168. //printf("%f\n",max );
  169. //printf("%d\n",i );
  170. }
  171. printf("%f\n",maksimum_korelacji);
  172. printf("%d\n",kat_sygnalu);
  173. print_max(bufor);
  174. return kat_sygnalu;//print(mic1);
  175.  
  176. }
  177.  
  178.  
  179.  
  180. int main(int argc,char* argv[])
  181. {
  182. Symuluj(mikrofon1,00,0);
  183. Symuluj(mikrofon2,20,40);
  184. Symuluj(mikrofon3,40,80);
  185. Symuluj(mikrofon4,60,120);
  186. Count_Delay();
  187.  
  188. if(argc>1)
  189. Beamforming(atoi(argv[1]));
  190. else
  191. Beamforming(0);
  192. print(mikrofon3,"syg1");
  193. print(mikrofon3,"syg2");
  194. print(mikrofon3,"syg3");
  195. print(mikrofon3,"syg4");
  196.  
  197. return 0;
  198. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement