#include #include "const.h" #include "windowsfunc.h" void Windows::RectangleWin(double* w, int n) { for (int i = 0; i < n; i++) { w[i] = 1; } } void Windows::TriangularWin(double* w, int n) { if (n & 1) { //nÎªÆæÊý for (int i = 0; i < (n - 1) / 2; i++) { w[i] = 2. * (i + 1) / (n + 1); } for (int i = (n - 1) / 2; i < n; i++) { w[i] = 2. * (n - i) / (n + 1); } } else { for (int i = 0; i < n/ 2; i++) { w[i] = (2. *i + 1) / n; } for (int i = n / 2; i < n; i++) { w[i] = w[n - 1 - i]; } } } void Windows::HannWin(double* w, int n) { for (int i = 0; i < n; i++) { w[i] = 0.5 * (1 - cos(2 * pi * i / (n - 1))); } } void Windows::HammingWin(double* w, int n) { for (int i = 0; i < n; i++) { w[i] = 0.54 - 0.46 * cos(2 * pi * i / (n - 1)); } } void Windows::BlackManWin(double* w, int n) { for (int i = 0; i < n; i++) { w[i] = 0.42 - 0.5 * cos(2 * pi * i / (n - 1)) + 0.08 * cos(4 * pi * i / (n - 1)); } } double Windows::besseli(double x, int n_terms ) { double sum = 1.0; double term = 1.0; double x_sq_half = x * x / 4.0; // (x/2)^2 for (int k = 1; k < n_terms; k++) { term *= x_sq_half / (k * k); sum += term; // Èç¹ûÏî±äµÃ·Ç³£Ð¡£¬ÌáǰÖÕÖ¹ÒÔÌá¸ßЧÂÊ if (term < 1e-15 * sum) { break; } } return sum; } void Windows::KaiserWin(double* w, int n, double beta ) { double theta; // ¼ÆËã·ÖĸµÄ±´Èû¶ûº¯ÊýÖµ£¨Ö»Ðè¼ÆËãÒ»´Î£© double denominator = besseli(beta); for (int i = 0; i < n; i++) { // ¼ÆËã²ÎÊý£º½«Ë÷ÒýÓ³Éäµ½ [-1, 1] Çø¼ä double argument = (2.0 * i) / (n - 1) - 1.0; theta = beta * sqrt(1 - argument * argument); w[i] = besseli(theta) / denominator; } }