Advertisement
Guest User

Untitled

a guest
Nov 23rd, 2017
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.73 KB | None | 0 0
  1. #define _USE_MATH_DEFINES
  2. #define _CRT_SECURE_NO_WARNINGS
  3. #include <iostream>
  4. #include <cmath>
  5. #include <fstream>
  6. #define M_PI 3.14159265358979323846
  7.  
  8. using namespace std;
  9.  
  10. void WriteToFile(const char* filename, int N, double *table, double *time) {
  11. ofstream file(filename);
  12.  
  13. for (int i = 0; i < N; i++) {
  14. file << table[i] << "\t" << time[i] << endl;
  15. }
  16.  
  17. };
  18.  
  19.  
  20. class sinusoida
  21. {
  22. protected:
  23.  
  24. double *x,*time, fs, f, T, fi;
  25. int N;
  26.  
  27. public:
  28. sinusoida(double Ts, double fs) {
  29.  
  30. this->fi = 3 * M_PI / 4;
  31. this->N = fs*Ts;
  32. this->fs = fs;
  33. this->f = 22;
  34. x = new double[N];
  35. time = new double[N];
  36. for (int i = 0; i < N; i++) {
  37. time[i]=0;
  38. }
  39. }
  40.  
  41. void generateSignal()
  42. {
  43. for (int i = 0; i< N; i++) {
  44. x[i] = 0.15*cos((2 * M_PI*f*i) / fs + fi);
  45. time[i] = (i + 1)*(1 / fs);
  46. }
  47.  
  48. }
  49.  
  50. virtual ~sinusoida() {
  51. delete[] x;
  52. delete[] time;
  53. }
  54. };
  55.  
  56.  
  57. class DFT1:sinusoida {
  58. double sumRe, sumIm;
  59. double *sumMod, *z;
  60.  
  61. public:
  62. DFT1() :sinusoida(2, 550){
  63. this->generateSignal();
  64. sumMod = new double[N];
  65. z = new double[N];
  66.  
  67. }
  68.  
  69. void generateDFT() {
  70. for (int k = 0; k < N; k++) {
  71. sumMod[k] = 0;
  72. }
  73. sumRe = 0;
  74. sumIm = 0;
  75.  
  76.  
  77. for (int k = 0; k < N; k++) {
  78. for (int n = 0; n < N; n++) {
  79. sumRe += x[n] * cos((-2 * M_PI*n*k) / N);
  80. sumIm += x[n] * sin((-2 * M_PI*n*k) / N);
  81. }
  82.  
  83. sumMod[k] += (sqrt(pow(sumRe, 2) + pow(sumIm, 2)));
  84. time[k] = k * (fs / N);
  85. sumRe = 0;
  86. sumIm = 0;
  87. }
  88. WriteToFile("zad1widmo.xls", N/2, sumMod, time);
  89. }
  90.  
  91. };
  92.  
  93.  
  94. class zad2 : public sinusoida {
  95. double *y, *z,*v;
  96. int nr;
  97.  
  98. public:
  99. zad2() :sinusoida(2, 550) {
  100. y = new double[N];
  101. z = new double[N];
  102. v = new double[N];
  103. }
  104.  
  105. void generateSignal1() {
  106. for (int i = 0; i < N; i++) {
  107. y[i] = sin(10 * M_PI*i / fs) + cos(16 * M_PI * i / fs);
  108. }
  109. for (int i = 0; i< N; i++) {
  110.  
  111. z[i] = sqrt(abs(y[i])) - x[i / 2];
  112.  
  113. }
  114. WriteToFile("zad2a.xls", N, z, time);
  115.  
  116. }
  117.  
  118. void generateSignal2() {
  119. for (int i = 0; i< N; i++) {
  120. y[i] = sin(10 * M_PI*i / fs) + cos(16 * M_PI * i / fs);
  121. }
  122. for (int i = 0; i< N; i++) {
  123.  
  124. v[i] = x[i] * pow(y[i], 2);
  125.  
  126. }
  127. WriteToFile("zad2b.xls", N, v, time);
  128.  
  129. }
  130.  
  131.  
  132.  
  133. ~zad2() {}
  134.  
  135. };
  136.  
  137. class DFT2:zad2 {
  138. double sumRe, sumIm;
  139. double *sumMod, *z;
  140.  
  141. public:
  142. DFT2() :zad2(){
  143. this->generateSignal2();
  144. sumMod = new double[N];
  145. z = new double[N];
  146.  
  147. }
  148.  
  149. void generateDFT() {
  150. for (int k = 0; k < N; k++) {
  151. sumMod[k] = 0;
  152. }
  153. sumRe = 0;
  154. sumIm = 0;
  155.  
  156.  
  157. for (int k = 0; k < N; k++) {
  158. for (int n = 0; n < N; n++) {
  159. sumRe += x[n] * cos((-2 * M_PI*n*k) / N);
  160. sumIm += x[n] * sin((-2 * M_PI*n*k) / N);
  161. }
  162.  
  163. sumMod[k] += (sqrt(pow(sumRe, 2) + pow(sumIm, 2)));
  164. time[k] = k * (fs / N);
  165. sumRe = 0;
  166. sumIm = 0;
  167. }
  168. WriteToFile("zad2bwidmo.xls", N/2, sumMod, time);
  169. }
  170.  
  171. };
  172.  
  173.  
  174.  
  175.  
  176.  
  177.  
  178.  
  179. class zad3 : public sinusoida {
  180.  
  181. public:
  182. zad3() :sinusoida(2, 4000) {}
  183. void generateSignal() {
  184.  
  185.  
  186. for (int i = 0; i < 2400; i++) {
  187. x[i] = sin(12 * M_PI*8000 / 4000) + pow(i, 2);
  188. }
  189. for (int i = 2400; i < 6000; i++) {
  190. x[i] = pow(i, 3) / sin(8 * M_PI * 8000 / 4000);
  191. }
  192. for (int i = 6000; i < 8000; i++) {
  193. x[i] = log2(i) / i;
  194.  
  195. }
  196.  
  197.  
  198. WriteToFile("zad3.xls", N, x, time);
  199. }
  200. ~zad3() {}
  201.  
  202. };
  203.  
  204. class DFT3 :zad3 {
  205. double sumRe, sumIm;
  206. double *sumMod, *z;
  207.  
  208. public:
  209. DFT3() :zad3() {
  210. this->generateSignal();
  211. sumMod = new double[N];
  212. z = new double[N];
  213.  
  214. }
  215.  
  216. void generateDFT() {
  217. for (int k = 0; k < N; k++) {
  218. sumMod[k] = 0;
  219. }
  220. sumRe = 0;
  221. sumIm = 0;
  222.  
  223.  
  224. for (int k = 0; k < N; k++) {
  225. for (int n = 0; n < N; n++) {
  226. sumRe += x[n] * cos((-2 * M_PI*n*k) / N);
  227. sumIm += x[n] * sin((-2 * M_PI*n*k) / N);
  228. }
  229.  
  230. sumMod[k] += (sqrt(pow(sumRe, 2) + pow(sumIm, 2)));
  231. time[k] = k * (fs / N);
  232. sumRe = 0;
  233. sumIm = 0;
  234. }
  235. WriteToFile("zad3widmo.xls", N / 2, sumMod, time);
  236. }
  237.  
  238. };
  239.  
  240.  
  241. class zad4 : public sinusoida
  242. {
  243. double sigma;
  244. int nr;
  245. char buffor[20];
  246. public:
  247. zad4() :sinusoida(1, 10000)
  248. {
  249. this->sigma = 0;
  250. this->nr = 0;
  251. }
  252. void generateSignal(int H)
  253. {
  254. nr++;
  255. for (int i = 0; i<N; i++) {
  256. for (int j = 0; j < H; j++) {
  257. sigma += (double)sin(10 * M_PI * i / fs*(2 * j + 1) / (2 * j - 1));
  258. }
  259. x[i] = (4 / (M_PI * M_PI))*sigma;
  260. time[i] = (i + 1)*(1 / fs);
  261. sigma = 0;
  262. }
  263. sprintf(buffor, "zad4 nr %d", nr);
  264. WriteToFile(buffor, N, x, time);
  265. }
  266. ~zad4() {}
  267. };
  268.  
  269. class DFT4 :zad4 {
  270. double sumRe, sumIm;
  271. double *sumMod, *z;
  272.  
  273. public:
  274. DFT4() :zad4() {
  275. this->generateSignal(20);
  276. sumMod = new double[N];
  277. z = new double[N];
  278.  
  279. }
  280.  
  281. void generateDFT() {
  282. for (int k = 0; k < N; k++) {
  283. sumMod[k] = 0;
  284. }
  285. sumRe = 0;
  286. sumIm = 0;
  287.  
  288.  
  289. for (int k = 0; k < N; k++) {
  290. for (int n = 0; n < N; n++) {
  291. sumRe += x[n] * cos((-2 * M_PI*n*k) / N);
  292. sumIm += x[n] * sin((-2 * M_PI*n*k) / N);
  293. }
  294.  
  295. sumMod[k] += (sqrt(pow(sumRe, 2) + pow(sumIm, 2)));
  296. time[k] = k * (fs / N);
  297. sumRe = 0;
  298. sumIm = 0;
  299. }
  300. WriteToFile("zad4awidmo.xls", N / 2, sumMod, time);
  301. }
  302.  
  303. };
  304.  
  305.  
  306. int main() {
  307.  
  308.  
  309. DFT1 *obj = new DFT1();
  310. obj->generateDFT();
  311.  
  312. DFT2 *obj1 = new DFT2();
  313. obj1->generateDFT();
  314.  
  315. DFT3 *obj2 = new DFT3();
  316. obj1->generateDFT();
  317.  
  318. DFT4 *obj3 = new DFT4();
  319. obj1->generateDFT();
  320.  
  321.  
  322. /*zad2 *obj = new zad2();
  323. obj->generateSignal();
  324. obj->generateSignal1();
  325. obj->generateSignal2();
  326.  
  327. zad3* obj1 = new zad3();
  328. obj1->generateSignal();
  329.  
  330. zad4 *obj2 = new zad4();
  331. obj2->generateSignal(20);
  332. obj2->generateSignal(60);
  333. obj2->generateSignal(80);
  334.  
  335. */
  336.  
  337.  
  338. //delete wsk;
  339. delete obj;
  340. delete obj1;
  341. delete obj2;
  342. delete obj3
  343. return 0;
  344.  
  345. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement