44 lines
1.4 KiB
C++
44 lines
1.4 KiB
C++
#include "fft_stage.hpp"
|
|
#include <cstring>
|
|
|
|
namespace fft_stage {
|
|
|
|
// 0x180008440: dst[i] *= src[i] (double, in-place elementwise; kernel 0x18003fa20)
|
|
void cplx_mul_scalar_inplace(double* dst, const double* src, uint32_t n) {
|
|
for (uint32_t i = 0; i < n; i++) {
|
|
dst[i] *= src[i];
|
|
}
|
|
}
|
|
|
|
// cplx_mul — complex elementwise multiply: out = in1 * in2 (conjugated 2nd)
|
|
void cplx_mul(double* out, const double* in1, const double* in2, uint32_t n) {
|
|
for (uint32_t i = 0; i < n * 2; i += 2) {
|
|
double re1 = in1[i + 0];
|
|
double im1 = in1[i + 1];
|
|
double re2 = in2[i + 0];
|
|
double im2 = in2[i + 1];
|
|
out[i + 0] = re1 * re2 - im1 * im2;
|
|
out[i + 1] = re1 * im2 + im1 * re2;
|
|
}
|
|
}
|
|
|
|
// stage_complex — reformat: read interleaved complex [re,im][n], write [re][n],[im][n]
|
|
void stage_complex(double* out, const double* in, const double* tw, uint32_t n) {
|
|
for (uint32_t i = 0; i < n; i++) {
|
|
double re1 = in[i * 2 + 0];
|
|
double im1 = in[i * 2 + 1];
|
|
double re2 = tw[i * 2 + 0];
|
|
double im2 = tw[i * 2 + 1];
|
|
out[i * 2 + 0] = re1 * re2 - im1 * im2;
|
|
out[i * 2 + 1] = re1 * im2 + im1 * re2;
|
|
}
|
|
}
|
|
|
|
// stage_double — scalar multiply (FUN_180008500): out[i] = in[i] * tw[i]
|
|
void stage_double(double* out, const double* in, const double* tw, uint32_t n) {
|
|
for (uint32_t i = 0; i < n; i++) {
|
|
out[i] = in[i] * tw[i];
|
|
}
|
|
}
|
|
|
|
} |