#include <cmath>
|
#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;
|
}
|
}
|