@@ -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}
0 commit comments