From 6d8681b780abb9b776c2c64401bf3bb22f118e46 Mon Sep 17 00:00:00 2001 From: Jan Trmal Date: Wed, 20 Nov 2019 12:56:47 -0500 Subject: [PATCH] adding features used externaly --- src/feat/feature-spectrogram.cc | 5 +++++ src/feat/feature-spectrogram.h | 16 ++++++++++++++-- src/feat/feature-window.cc | 4 ++++ src/feat/feature-window.h | 4 ++-- 4 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/feat/feature-spectrogram.cc b/src/feat/feature-spectrogram.cc index 7eee2643cf5..1a9ea3a93ee 100644 --- a/src/feat/feature-spectrogram.cc +++ b/src/feat/feature-spectrogram.cc @@ -62,6 +62,11 @@ void SpectrogramComputer::Compute(BaseFloat signal_raw_log_energy, else // An alternative algorithm that works for non-powers-of-two RealFft(signal_frame, true); + if (opts_.return_raw_fft) { + feature->CopyFromVec(*signal_frame); + return; + } + // Convert the FFT into a power spectrum. ComputePowerSpectrum(signal_frame); SubVector power_spectrum(*signal_frame, diff --git a/src/feat/feature-spectrogram.h b/src/feat/feature-spectrogram.h index 132a6875e00..0b1061ad991 100644 --- a/src/feat/feature-spectrogram.h +++ b/src/feat/feature-spectrogram.h @@ -39,10 +39,14 @@ struct SpectrogramOptions { FrameExtractionOptions frame_opts; BaseFloat energy_floor; bool raw_energy; // If true, compute energy before preemphasis and windowing + bool return_raw_fft; // If true, return the raw FFT spectrum + // Note that in that case the Dim() will return double + // the expected dimension (because of the complex domain of it) SpectrogramOptions() : energy_floor(0.0), - raw_energy(true) {} + raw_energy(true), + return_raw_fft(false) {} void Register(OptionsItf *opts) { frame_opts.Register(opts); @@ -54,6 +58,8 @@ struct SpectrogramOptions { "std::numeric_limits::epsilon()."); opts->Register("raw-energy", &raw_energy, "If true, compute energy before preemphasis and windowing"); + opts->Register("return-raw-fft", &return_raw_fft, + "If true, return raw FFT complex numbers instead of log magnitudes"); } }; @@ -68,7 +74,13 @@ class SpectrogramComputer { return opts_.frame_opts; } - int32 Dim() const { return opts_.frame_opts.PaddedWindowSize() / 2 + 1; } + int32 Dim() const { + if (opts_.return_raw_fft) { + return opts_.frame_opts.PaddedWindowSize(); + } else { + return opts_.frame_opts.PaddedWindowSize() / 2 + 1; + } + } bool NeedRawLogEnergy() const { return opts_.raw_energy; } diff --git a/src/feat/feature-window.cc b/src/feat/feature-window.cc index c5d4cc29831..1dea03d6791 100644 --- a/src/feat/feature-window.cc +++ b/src/feat/feature-window.cc @@ -115,6 +115,10 @@ FeatureWindowFunction::FeatureWindowFunction(const FrameExtractionOptions &opts) double i_fl = static_cast(i); if (opts.window_type == "hanning") { window(i) = 0.5 - 0.5*cos(a * i_fl); + } else if (opts.window_type == "sine") { + // when you are checking ws wikipedia, please + // note that 0.5 * a = M_PI/(frame_length-1) + window(i) = sin(0.5 * a * i_fl); } else if (opts.window_type == "hamming") { window(i) = 0.54 - 0.46*cos(a * i_fl); } else if (opts.window_type == "povey") { // like hamming but goes to zero at edges. diff --git a/src/feat/feature-window.h b/src/feat/feature-window.h index a7abba50eca..e6d673937ac 100644 --- a/src/feat/feature-window.h +++ b/src/feat/feature-window.h @@ -40,7 +40,7 @@ struct FrameExtractionOptions { BaseFloat preemph_coeff; // Preemphasis coefficient. bool remove_dc_offset; // Subtract mean of wave before FFT. std::string window_type; // e.g. Hamming window - // May be "hamming", "rectangular", "povey", "hanning", "blackman" + // May be "hamming", "rectangular", "povey", "hanning", "sine", "blackman" // "povey" is a window I made to be similar to Hamming but to go to zero at the // edges, it's pow((0.5 - 0.5*cos(n/N*2*pi)), 0.85) // I just don't think the Hamming window makes sense as a windowing function. @@ -81,7 +81,7 @@ struct FrameExtractionOptions { "option, e.g. to 1.0 or 0.1"); opts->Register("window-type", &window_type, "Type of window " "(\"hamming\"|\"hanning\"|\"povey\"|\"rectangular\"" - "|\"blackmann\")"); + "|\"sine\"|\"blackmann\")"); opts->Register("blackman-coeff", &blackman_coeff, "Constant coefficient for generalized Blackman window."); opts->Register("round-to-power-of-two", &round_to_power_of_two,