MayaFlux 0.1.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches

◆ process_spectral_windows()

template<typename ProcessorFunc >
std::vector< double > MayaFlux::Yantra::process_spectral_windows ( std::span< double >  data,
uint32_t  window_size,
uint32_t  hop_size,
ProcessorFunc &&  processor 
)

Common spectral processing helper to eliminate code duplication.

Template Parameters
ProcessorFuncFunction type for spectral processing
Parameters
dataInput data span
window_sizeSize of analysis window
hop_sizeHop size between windows
processorFunction to process spectrum in each window
Returns
Processed audio data

Definition at line 44 of file SpectralHelper.hpp.

49{
50 const size_t num_windows = (data.size() >= window_size) ? (data.size() - window_size) / hop_size + 1 : 0;
51
52 if (num_windows == 0) {
53 return { data.begin(), data.end() };
54 }
55
56 std::vector<double> output(data.size(), 0.0);
57
58 auto hann_window = Nodes::Generator::generate_window(window_size, Nodes::Generator::WindowType::HANNING);
59
60 Eigen::FFT<double> fft;
61
62 auto window_indices = std::views::iota(size_t { 0 }, num_windows);
63
64 std::ranges::for_each(window_indices, [&](size_t win) {
65 size_t start_idx = win * hop_size;
66 auto window_data = data.subspan(start_idx,
67 std::min(static_cast<size_t>(window_size), data.size() - start_idx));
68
69 Eigen::VectorXd windowed = Eigen::VectorXd::Zero(static_cast<Eigen::Index>(window_size));
70 const size_t actual_size = std::min(window_data.size(), hann_window.size());
71
72 for (size_t j = 0; j < actual_size; ++j) {
73 windowed(static_cast<Eigen::Index>(j)) = window_data[j] * hann_window[j];
74 }
75
76 Eigen::VectorXcd spectrum;
77 fft.fwd(spectrum, windowed);
78
79 std::forward<ProcessorFunc>(processor)(spectrum, win);
80
81 Eigen::VectorXd result;
82 fft.inv(result, spectrum);
83
84 for (size_t i = 0; i < static_cast<size_t>(result.size()) && start_idx + i < output.size(); ++i) {
85 output[start_idx + i] += result[static_cast<Eigen::Index>(i)];
86 }
87 });
88
89 return output;
90}

References MayaFlux::Nodes::Generator::generate_window(), and MayaFlux::Nodes::Generator::HANNING.

Referenced by MayaFlux::Yantra::SpectralTransformer< InputType, OutputType >::transform_implementation(), transform_pitch_shift(), transform_pitch_shift(), transform_spectral_filter(), transform_spectral_filter(), transform_spectral_invert(), and transform_spectral_invert().

+ Here is the call graph for this function:
+ Here is the caller graph for this function: