Skip to content

Commit b6d41b6

Browse files
authored
Merge pull request #76 from sp-nitech/window
Support periodic window
2 parents 702ada8 + 12dcaa0 commit b6d41b6

File tree

3 files changed

+30
-24
lines changed

3 files changed

+30
-24
lines changed

src/main/window.cc

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ const int kDefaultFrameLength(256);
4242
const sptk::DataWindowing::NormalizationType kDefaultNormalizationType(
4343
sptk::DataWindowing::NormalizationType::kPower);
4444
const LocalWindowType kDefaultWindowType(kBlackman);
45+
const bool kDefaultPeriodicFlag(false);
4546

4647
void PrintUsage(std::ostream* stream) {
4748
// clang-format off
@@ -65,6 +66,7 @@ void PrintUsage(std::ostream* stream) {
6566
*stream << " 4 (trapezoidal)" << std::endl;
6667
*stream << " 5 (rectangular)" << std::endl;
6768
*stream << " 6 (Nuttall)" << std::endl;
69+
*stream << " -p : use periodic window ( bool)[" << std::setw(5) << std::right << sptk::ConvertBooleanToString(kDefaultPeriodicFlag) << "]" << std::endl; // NOLINT
6870
*stream << " -h : print this message" << std::endl;
6971
*stream << " infile:" << std::endl;
7072
*stream << " data sequence (double)[stdin]" << std::endl; // NOLINT
@@ -99,6 +101,8 @@ void PrintUsage(std::ostream* stream) {
99101
* \arg @c 4 Trapezoidal
100102
* \arg @c 5 Rectangular
101103
* \arg @c 6 Nuttall
104+
* - @b -p
105+
* - use periodic window instead of symmetric one
102106
* - @b infile @e str
103107
* - double-type data sequence
104108
* - @b stdout
@@ -121,9 +125,10 @@ int main(int argc, char* argv[]) {
121125
sptk::DataWindowing::NormalizationType normalization_type(
122126
kDefaultNormalizationType);
123127
LocalWindowType local_window_type(kDefaultWindowType);
128+
bool periodic(kDefaultPeriodicFlag);
124129

125130
for (;;) {
126-
const int option_char(getopt_long(argc, argv, "l:L:n:w:h", NULL, NULL));
131+
const int option_char(getopt_long(argc, argv, "l:L:n:w:ph", NULL, NULL));
127132
if (-1 == option_char) break;
128133

129134
switch (option_char) {
@@ -183,6 +188,10 @@ int main(int argc, char* argv[]) {
183188
local_window_type = static_cast<LocalWindowType>(tmp);
184189
break;
185190
}
191+
case 'p': {
192+
periodic = true;
193+
break;
194+
}
186195
case 'h': {
187196
PrintUsage(&std::cout);
188197
return 0;
@@ -268,7 +277,7 @@ int main(int argc, char* argv[]) {
268277
}
269278
}
270279

271-
sptk::StandardWindow standard_window(input_length, window_type, false);
280+
sptk::StandardWindow standard_window(input_length, window_type, periodic);
272281
sptk::DataWindowing data_windowing(&standard_window, output_length,
273282
normalization_type);
274283
if (!data_windowing.IsValid()) {

src/window/standard_window.cc

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
#include "SPTK/window/standard_window.h"
1818

19-
#include <algorithm> // std::fill
19+
#include <algorithm> // std::fill, std::min
2020
#include <cmath> // std::round
2121
#include <vector> // std::vector
2222

@@ -26,7 +26,7 @@ namespace {
2626

2727
void MakeBartlett(bool periodic, std::vector<double>* window) {
2828
const int size(static_cast<int>(window->size()));
29-
const int center(sptk::IsEven(size) ? size / 2 : (size + 1) / 2);
29+
const int center((sptk::IsEven(size) ? size : (size + 1)) / 2);
3030
const double slope(2.0 / (periodic ? size : size - 1));
3131
double* w(&((*window)[0]));
3232
for (int i(0); i < center; ++i) {
@@ -87,16 +87,11 @@ void MakeRectangular(std::vector<double>* window) {
8787
}
8888

8989
void MakeTrapezoidal(bool periodic, std::vector<double>* window) {
90+
MakeBartlett(periodic, window);
9091
const int size(static_cast<int>(window->size()));
91-
const int quarter_size(static_cast<int>(std::round(0.25 * size)));
92-
const double slope(4.0 / (periodic ? size : size - 1));
9392
double* w(&((*window)[0]));
94-
for (int i(0); i < quarter_size; ++i) {
95-
w[i] = slope * i;
96-
}
97-
std::fill(window->begin() + quarter_size, window->end() - quarter_size, 1.0);
98-
for (int i(size - quarter_size); i < size; ++i) {
99-
w[i] = 4.0 - slope * i;
93+
for (int i(0); i < size; ++i) {
94+
w[i] = std::min(2.0 * w[i], 1.0);
10095
}
10196
}
10297

test/test_window.bats

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -28,18 +28,20 @@ teardown() {
2828
}
2929

3030
@test "window: compatibility" {
31-
$sptk3/nrand -l 20 > $tmp/1
32-
for w in $(seq 0 5); do
33-
$sptk3/window -w "$w" $tmp/1 > $tmp/2
34-
$sptk4/window -w "$w" $tmp/1 > $tmp/3
35-
run $sptk4/aeq $tmp/2 $tmp/3
36-
[ "$status" -eq 0 ]
37-
done
38-
for n in $(seq 0 2); do
39-
$sptk3/window -n "$n" $tmp/1 > $tmp/2
40-
$sptk4/window -n "$n" $tmp/1 > $tmp/3
41-
run $sptk4/aeq $tmp/2 $tmp/3
42-
[ "$status" -eq 0 ]
31+
for l in 19 20; do
32+
$sptk3/nrand -l $l > $tmp/1
33+
for w in $(seq 0 5); do
34+
$sptk3/window -w "$w" $tmp/1 > $tmp/2
35+
$sptk4/window -w "$w" $tmp/1 > $tmp/3
36+
run $sptk4/aeq $tmp/2 $tmp/3
37+
[ "$status" -eq 0 ]
38+
done
39+
for n in $(seq 0 2); do
40+
$sptk3/window -n "$n" $tmp/1 > $tmp/2
41+
$sptk4/window -n "$n" $tmp/1 > $tmp/3
42+
run $sptk4/aeq $tmp/2 $tmp/3
43+
[ "$status" -eq 0 ]
44+
done
4345
done
4446
}
4547

0 commit comments

Comments
 (0)