Skip to content

Commit 25977b8

Browse files
committed
fix: adjust static fft processing
1 parent aacd4ac commit 25977b8

2 files changed

Lines changed: 88 additions & 52 deletions

File tree

source/zlp/controller.cpp

Lines changed: 82 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@ namespace zlp {
1919
}
2020

2121
void Controller::processStereoStatic() {
22+
zldsp::vector::multiply(fft_ins_[0].data(), window1_.data(), fft_size_);
23+
zldsp::vector::multiply(fft_ins_[1].data(), window1_.data(), fft_size_);
24+
25+
fft_->forward(fft_ins_[0].data(), {fft_out_reals_[0].data(), fft_out_imags_[0].data()});
26+
fft_->forward(fft_ins_[1].data(), {fft_out_reals_[1].data(), fft_out_imags_[1].data()});
27+
2228
auto* HWY_RESTRICT l_real_ptr = fft_out_reals_[0].data();
2329
auto* HWY_RESTRICT l_imag_ptr = fft_out_imags_[0].data();
2430
auto* HWY_RESTRICT r_real_ptr = fft_out_reals_[1].data();
@@ -41,75 +47,101 @@ namespace zlp {
4147
hn::Store(hn::Mul(vr_imag, v_mag), d, r_imag_ptr + i);
4248
}
4349
}
44-
}
4550

46-
void Controller::processLRStatic() {
47-
auto* HWY_RESTRICT l_real_ptr = fft_out_reals_[0].data();
48-
auto* HWY_RESTRICT l_imag_ptr = fft_out_imags_[0].data();
49-
auto* HWY_RESTRICT r_real_ptr = fft_out_reals_[1].data();
50-
auto* HWY_RESTRICT r_imag_ptr = fft_out_imags_[1].data();
51+
fft_->backward({fft_out_reals_[0].data(), fft_out_imags_[0].data()}, fft_ins_[0].data());
52+
fft_->backward({fft_out_reals_[1].data(), fft_out_imags_[1].data()}, fft_ins_[1].data());
5153

52-
const auto* HWY_RESTRICT l_mag_ptr = l_data_.static_response_linear.data();
53-
const auto* HWY_RESTRICT r_mag_ptr = r_data_.static_response_linear.data();
54+
zldsp::vector::multiply(fft_ins_[0].data(), window2_.data(), fft_size_);
55+
zldsp::vector::multiply(fft_ins_[1].data(), window2_.data(), fft_size_);
56+
}
5457

55-
for (size_t i = 0; i < num_bin_effective_; i += lanes) {
56-
{
58+
void Controller::processLRStatic() {
59+
if (l_data_.is_static_active_) {
60+
zldsp::vector::multiply(fft_ins_[0].data(), window1_.data(), fft_size_);
61+
fft_->forward(fft_ins_[0].data(), {fft_out_reals_[0].data(), fft_out_imags_[0].data()});
62+
auto* HWY_RESTRICT l_real_ptr = fft_out_reals_[0].data();
63+
auto* HWY_RESTRICT l_imag_ptr = fft_out_imags_[0].data();
64+
const auto* HWY_RESTRICT l_mag_ptr = l_data_.static_response_linear.data();
65+
for (size_t i = 0; i < num_bin_effective_; i += lanes) {
5766
const auto vl_mag = hn::Load(d, l_mag_ptr + i);
5867
const auto vl_real = hn::Load(d, l_real_ptr + i);
5968
hn::Store(hn::Mul(vl_real, vl_mag), d, l_real_ptr + i);
6069
const auto vl_imag = hn::Load(d, l_imag_ptr + i);
6170
hn::Store(hn::Mul(vl_imag, vl_mag), d, l_imag_ptr + i);
6271
}
63-
{
72+
fft_->backward({fft_out_reals_[0].data(), fft_out_imags_[0].data()}, fft_ins_[0].data());
73+
zldsp::vector::multiply(fft_ins_[0].data(), window2_.data(), fft_size_);
74+
} else {
75+
zldsp::vector::multiply(fft_ins_[0].data(), window_bypass_.data(), fft_size_);
76+
}
77+
if (r_data_.is_static_active_) {
78+
zldsp::vector::multiply(fft_ins_[1].data(), window1_.data(), fft_size_);
79+
fft_->forward(fft_ins_[1].data(), {fft_out_reals_[1].data(), fft_out_imags_[1].data()});
80+
auto* HWY_RESTRICT r_real_ptr = fft_out_reals_[1].data();
81+
auto* HWY_RESTRICT r_imag_ptr = fft_out_imags_[1].data();
82+
const auto* HWY_RESTRICT r_mag_ptr = r_data_.static_response_linear.data();
83+
for (size_t i = 0; i < num_bin_effective_; i += lanes) {
6484
const auto vr_mag = hn::Load(d, r_mag_ptr + i);
6585
const auto vr_real = hn::Load(d, r_real_ptr + i);
6686
hn::Store(hn::Mul(vr_real, vr_mag), d, r_real_ptr + i);
6787
const auto vr_imag = hn::Load(d, r_imag_ptr + i);
6888
hn::Store(hn::Mul(vr_imag, vr_mag), d, r_imag_ptr + i);
6989
}
90+
fft_->backward({fft_out_reals_[1].data(), fft_out_imags_[1].data()}, fft_ins_[1].data());
91+
zldsp::vector::multiply(fft_ins_[1].data(), window2_.data(), fft_size_);
92+
} else {
93+
zldsp::vector::multiply(fft_ins_[1].data(), window_bypass_.data(), fft_size_);
7094
}
7195
}
7296

7397
void Controller::processMSStatic() {
74-
auto* HWY_RESTRICT l_real_ptr = fft_out_reals_[0].data();
75-
auto* HWY_RESTRICT l_imag_ptr = fft_out_imags_[0].data();
76-
auto* HWY_RESTRICT r_real_ptr = fft_out_reals_[1].data();
77-
auto* HWY_RESTRICT r_imag_ptr = fft_out_imags_[1].data();
78-
79-
const auto* HWY_RESTRICT m_mag_ptr = m_data_.static_response_linear.data();
80-
const auto* HWY_RESTRICT s_mag_ptr = s_data_.static_response_linear.data();
81-
82-
const auto v_half = hn::Set(d, 0.5f);
83-
84-
for (size_t i = 0; i < num_bin_effective_; i += lanes) {
85-
const auto vl_real = hn::Load(d, l_real_ptr + i);
86-
const auto vr_real = hn::Load(d, r_real_ptr + i);
87-
const auto vl_imag = hn::Load(d, l_imag_ptr + i);
88-
const auto vr_imag = hn::Load(d, r_imag_ptr + i);
89-
90-
auto vm_real = hn::Mul(hn::Add(vl_real, vr_real), v_half);
91-
auto vs_real = hn::Mul(hn::Sub(vl_real, vr_real), v_half);
92-
auto vm_imag = hn::Mul(hn::Add(vl_imag, vr_imag), v_half);
93-
auto vs_imag = hn::Mul(hn::Sub(vl_imag, vr_imag), v_half);
94-
95-
const auto vm_mag = hn::Load(d, m_mag_ptr + i);
96-
const auto vs_mag = hn::Load(d, s_mag_ptr + i);
97-
98-
vm_real = hn::Mul(vm_real, vm_mag);
99-
vm_imag = hn::Mul(vm_imag, vm_mag);
100-
vs_real = hn::Mul(vs_real, vs_mag);
101-
vs_imag = hn::Mul(vs_imag, vs_mag);
102-
103-
hn::Store(hn::Add(vm_real, vs_real), d, l_real_ptr + i);
104-
hn::Store(hn::Sub(vm_real, vs_real), d, r_real_ptr + i);
105-
hn::Store(hn::Add(vm_imag, vs_imag), d, l_imag_ptr + i);
106-
hn::Store(hn::Sub(vm_imag, vs_imag), d, r_imag_ptr + i);
98+
zldsp::splitter::InplaceMSSplitter<float>::split(fft_ins_[0].data(), fft_ins_[1].data(), fft_size_);
99+
if (m_data_.is_static_active_) {
100+
zldsp::vector::multiply(fft_ins_[0].data(), window1_.data(), fft_size_);
101+
fft_->forward(fft_ins_[0].data(), {fft_out_reals_[0].data(), fft_out_imags_[0].data()});
102+
auto* HWY_RESTRICT m_real_ptr = fft_out_reals_[0].data();
103+
auto* HWY_RESTRICT m_imag_ptr = fft_out_imags_[0].data();
104+
const auto* HWY_RESTRICT m_mag_ptr = m_data_.static_response_linear.data();
105+
for (size_t i = 0; i < num_bin_effective_; i += lanes) {
106+
const auto vl_mag = hn::Load(d, m_mag_ptr + i);
107+
const auto vl_real = hn::Load(d, m_real_ptr + i);
108+
hn::Store(hn::Mul(vl_real, vl_mag), d, m_real_ptr + i);
109+
const auto vl_imag = hn::Load(d, m_imag_ptr + i);
110+
hn::Store(hn::Mul(vl_imag, vl_mag), d, m_imag_ptr + i);
111+
}
112+
fft_->backward({fft_out_reals_[0].data(), fft_out_imags_[0].data()}, fft_ins_[0].data());
113+
zldsp::vector::multiply(fft_ins_[0].data(), window2_.data(), fft_size_);
114+
} else {
115+
zldsp::vector::multiply(fft_ins_[0].data(), window_bypass_.data(), fft_size_);
116+
}
117+
if (s_data_.is_static_active_) {
118+
zldsp::vector::multiply(fft_ins_[1].data(), window1_.data(), fft_size_);
119+
fft_->forward(fft_ins_[1].data(), {fft_out_reals_[1].data(), fft_out_imags_[1].data()});
120+
auto* HWY_RESTRICT s_real_ptr = fft_out_reals_[1].data();
121+
auto* HWY_RESTRICT s_imag_ptr = fft_out_imags_[1].data();
122+
const auto* HWY_RESTRICT s_mag_ptr = s_data_.static_response_linear.data();
123+
for (size_t i = 0; i < num_bin_effective_; i += lanes) {
124+
const auto vr_mag = hn::Load(d, s_mag_ptr + i);
125+
const auto vr_real = hn::Load(d, s_real_ptr + i);
126+
hn::Store(hn::Mul(vr_real, vr_mag), d, s_real_ptr + i);
127+
const auto vr_imag = hn::Load(d, s_imag_ptr + i);
128+
hn::Store(hn::Mul(vr_imag, vr_mag), d, s_imag_ptr + i);
129+
}
130+
fft_->backward({fft_out_reals_[1].data(), fft_out_imags_[1].data()}, fft_ins_[1].data());
131+
zldsp::vector::multiply(fft_ins_[1].data(), window2_.data(), fft_size_);
132+
} else {
133+
zldsp::vector::multiply(fft_ins_[1].data(), window_bypass_.data(), fft_size_);
107134
}
135+
zldsp::splitter::InplaceMSSplitter<float>::combine(fft_ins_[0].data(), fft_ins_[1].data(), fft_size_);
108136
}
109137

110138
void Controller::processLRMSStatic() {
111-
static constexpr hn::ScalableTag<float> d;
112-
static constexpr size_t lanes = hn::MaxLanes(d);
139+
zldsp::vector::multiply(fft_ins_[0].data(), window1_.data(), fft_size_);
140+
zldsp::vector::multiply(fft_ins_[1].data(), window1_.data(), fft_size_);
141+
142+
fft_->forward(fft_ins_[0].data(), {fft_out_reals_[0].data(), fft_out_imags_[0].data()});
143+
fft_->forward(fft_ins_[1].data(), {fft_out_reals_[1].data(), fft_out_imags_[1].data()});
144+
113145
auto* HWY_RESTRICT l_real_ptr = fft_out_reals_[0].data();
114146
auto* HWY_RESTRICT l_imag_ptr = fft_out_imags_[0].data();
115147
auto* HWY_RESTRICT r_real_ptr = fft_out_reals_[1].data();
@@ -154,9 +186,11 @@ namespace zlp {
154186
hn::Store(hn::Add(vm_imag, vs_imag), d, l_imag_ptr + i);
155187
hn::Store(hn::Sub(vm_imag, vs_imag), d, r_imag_ptr + i);
156188
}
157-
}
158189

159-
void Controller::processStereoDynamic() {
190+
fft_->backward({fft_out_reals_[0].data(), fft_out_imags_[0].data()}, fft_ins_[0].data());
191+
fft_->backward({fft_out_reals_[1].data(), fft_out_imags_[1].data()}, fft_ins_[1].data());
160192

193+
zldsp::vector::multiply(fft_ins_[0].data(), window2_.data(), fft_size_);
194+
zldsp::vector::multiply(fft_ins_[1].data(), window2_.data(), fft_size_);
161195
}
162196
}

source/zlp/controller.hpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "../dsp/filter/spec_dynamic/spec_dynamic.hpp"
2020
#include "../dsp/filter/spec_dynamic/spec_smoother.hpp"
2121
#include "../dsp/splitter/inplace_ms_splitter.hpp"
22+
#include "../dsp/fft/zldsp_fft_include.hpp"
2223

2324
#include "../chore/thread/notifier.hpp"
2425

@@ -59,6 +60,7 @@ namespace zlp {
5960
};
6061

6162
struct ChannelData {
63+
bool is_static_active_{false};
6264
zldsp::vector::aligned_vector<float> static_response_linear;
6365
zldsp::filter::SpecSmoother<float>::SmoothBounds smooth_bounds;
6466
};
@@ -80,17 +82,19 @@ namespace zlp {
8082
= make_array_of<zldsp::filter::SpecDynamic<float>, kBandNum>();
8183
zldsp::filter::SpecSmoother<float> spec_smoother_;
8284
// fft working space
85+
std::unique_ptr<zldsp::fft::RFFT<float>> fft_;
8386
size_t fft_order_ = 12;
8487
size_t fft_size_ = static_cast<size_t>(1) << fft_order_;
8588
size_t num_bin_ = fft_size_ / 2 + 1;
8689
size_t num_bin_effective_ = fft_size_ / 2;
90+
zldsp::vector::aligned_vector<float> window1_, window2_, window_bypass_;
8791

8892
std::array<zldsp::vector::aligned_vector<float>, 4> input_fifos_, output_fifos_;
89-
zldsp::vector::aligned_vector<float> fft_in_;
93+
std::array<zldsp::vector::aligned_vector<float>, 4> fft_ins_;
9094
std::array<zldsp::vector::aligned_vector<float>, 2> fft_out_reals_, fft_out_imags_;
9195
zldsp::vector::aligned_vector<float> fft_side_abs_sqr_;
9296

93-
ChannelData l_data_, r_data_, m_data_, s_data_;
97+
ChannelData stereo_data_, l_data_, r_data_, m_data_, s_data_;
9498

9599
void handleAsyncUpdate() override {}
96100

@@ -101,7 +105,5 @@ namespace zlp {
101105
void processMSStatic();
102106

103107
void processLRMSStatic();
104-
105-
void processStereoDynamic();
106108
};
107109
}

0 commit comments

Comments
 (0)