Skip to content

Commit f343fc7

Browse files
committed
Fixed FFT computation for several implementations
1 parent c21c0b6 commit f343fc7

File tree

4 files changed

+70
-67
lines changed

4 files changed

+70
-67
lines changed

include/private/dsp/arch/aarch64/asimd/fft.h

+32-31
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*
2-
* Copyright (C) 2020 Linux Studio Plugins Project <https://lsp-plug.in/>
3-
* (C) 2020 Vladimir Sadovnikov <[email protected]>
2+
* Copyright (C) 2025 Linux Studio Plugins Project <https://lsp-plug.in/>
3+
* (C) 2025 Vladimir Sadovnikov <[email protected]>
44
*
55
* This file is part of lsp-dsp-lib
66
* Created on: 31 мар. 2020 г.
@@ -42,15 +42,15 @@ namespace lsp
4242
{
4343
if (rank == 2)
4444
{
45-
float s0_re = src_re[0] + src_re[1];
46-
float s1_re = src_re[0] - src_re[1];
47-
float s2_re = src_re[2] + src_re[3];
48-
float s3_re = src_re[2] - src_re[3];
45+
float s0_re = src_re[0] + src_re[2];
46+
float s1_re = src_re[0] - src_re[2];
47+
float s2_re = src_re[1] + src_re[3];
48+
float s3_re = src_re[1] - src_re[3];
4949

50-
float s0_im = src_im[0] + src_im[1];
51-
float s1_im = src_im[0] - src_im[1];
52-
float s2_im = src_im[2] + src_im[3];
53-
float s3_im = src_im[2] - src_im[3];
50+
float s0_im = src_im[0] + src_im[2];
51+
float s1_im = src_im[0] - src_im[2];
52+
float s2_im = src_im[1] + src_im[3];
53+
float s3_im = src_im[1] - src_im[3];
5454

5555
dst_re[0] = s0_re + s2_re;
5656
dst_re[1] = s1_re + s3_im;
@@ -104,25 +104,25 @@ namespace lsp
104104
{
105105
if (rank == 2)
106106
{
107-
float s0_re = src_re[0] + src_re[1];
108-
float s1_re = src_re[0] - src_re[1];
109-
float s2_re = src_re[2] + src_re[3];
110-
float s3_re = src_re[2] - src_re[3];
111-
112-
float s0_im = src_im[0] + src_im[1];
113-
float s1_im = src_im[0] - src_im[1];
114-
float s2_im = src_im[2] + src_im[3];
115-
float s3_im = src_im[2] - src_im[3];
116-
117-
dst_re[0] = (s0_re + s2_re)*0.25f;
118-
dst_re[1] = (s1_re - s3_im)*0.25f;
119-
dst_re[2] = (s0_re - s2_re)*0.25f;
120-
dst_re[3] = (s1_re + s3_im)*0.25f;
121-
122-
dst_im[0] = (s0_im + s2_im)*0.25f;
123-
dst_im[1] = (s1_im + s3_re)*0.25f;
124-
dst_im[2] = (s0_im - s2_im)*0.25f;
125-
dst_im[3] = (s1_im - s3_re)*0.25f;
107+
float s0_re = src_re[0] + src_re[2];
108+
float s1_re = src_re[0] - src_re[2];
109+
float s2_re = src_re[1] + src_re[3];
110+
float s3_re = src_re[1] - src_re[3];
111+
112+
float s0_im = src_im[0] + src_im[2];
113+
float s1_im = src_im[0] - src_im[2];
114+
float s2_im = src_im[1] + src_im[3];
115+
float s3_im = src_im[1] - src_im[3];
116+
117+
dst_re[0] = (s0_re + s2_re) * 0.25f;
118+
dst_re[1] = (s1_re - s3_im) * 0.25f;
119+
dst_re[2] = (s0_re - s2_re) * 0.25f;
120+
dst_re[3] = (s1_re + s3_im) * 0.25f;
121+
122+
dst_im[0] = (s0_im + s2_im) * 0.25f;
123+
dst_im[1] = (s1_im + s3_re) * 0.25f;
124+
dst_im[2] = (s0_im - s2_im) * 0.25f;
125+
dst_im[3] = (s1_im - s3_re) * 0.25f;
126126
}
127127
else if (rank == 1)
128128
{
@@ -160,7 +160,8 @@ namespace lsp
160160

161161
dsp::normalize_fft2(dst_re, dst_im, rank);
162162
}
163-
}
164-
}
163+
164+
} /* namespace asimd */
165+
} /* namespace lsp */
165166

166167
#endif /* PRIVATE_DSP_ARCH_AARCH64_ASIMD_FFT_H_ */

include/private/dsp/arch/arm/neon-d32/fft.h

+32-31
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*
2-
* Copyright (C) 2020 Linux Studio Plugins Project <https://lsp-plug.in/>
3-
* (C) 2020 Vladimir Sadovnikov <[email protected]>
2+
* Copyright (C) 2025 Linux Studio Plugins Project <https://lsp-plug.in/>
3+
* (C) 2025 Vladimir Sadovnikov <[email protected]>
44
*
55
* This file is part of lsp-dsp-lib
66
* Created on: 31 мар. 2020 г.
@@ -44,15 +44,15 @@ namespace lsp
4444
{
4545
if (rank == 2)
4646
{
47-
float s0_re = src_re[0] + src_re[1];
48-
float s1_re = src_re[0] - src_re[1];
49-
float s2_re = src_re[2] + src_re[3];
50-
float s3_re = src_re[2] - src_re[3];
47+
float s0_re = src_re[0] + src_re[2];
48+
float s1_re = src_re[0] - src_re[2];
49+
float s2_re = src_re[1] + src_re[3];
50+
float s3_re = src_re[1] - src_re[3];
5151

52-
float s0_im = src_im[0] + src_im[1];
53-
float s1_im = src_im[0] - src_im[1];
54-
float s2_im = src_im[2] + src_im[3];
55-
float s3_im = src_im[2] - src_im[3];
52+
float s0_im = src_im[0] + src_im[2];
53+
float s1_im = src_im[0] - src_im[2];
54+
float s2_im = src_im[1] + src_im[3];
55+
float s3_im = src_im[1] - src_im[3];
5656

5757
dst_re[0] = s0_re + s2_re;
5858
dst_re[1] = s1_re + s3_im;
@@ -98,25 +98,25 @@ namespace lsp
9898
{
9999
if (rank == 2)
100100
{
101-
float s0_re = src_re[0] + src_re[1];
102-
float s1_re = src_re[0] - src_re[1];
103-
float s2_re = src_re[2] + src_re[3];
104-
float s3_re = src_re[2] - src_re[3];
105-
106-
float s0_im = src_im[0] + src_im[1];
107-
float s1_im = src_im[0] - src_im[1];
108-
float s2_im = src_im[2] + src_im[3];
109-
float s3_im = src_im[2] - src_im[3];
110-
111-
dst_re[0] = (s0_re + s2_re)*0.25f;
112-
dst_re[1] = (s1_re - s3_im)*0.25f;
113-
dst_re[2] = (s0_re - s2_re)*0.25f;
114-
dst_re[3] = (s1_re + s3_im)*0.25f;
115-
116-
dst_im[0] = (s0_im + s2_im)*0.25f;
117-
dst_im[1] = (s1_im + s3_re)*0.25f;
118-
dst_im[2] = (s0_im - s2_im)*0.25f;
119-
dst_im[3] = (s1_im - s3_re)*0.25f;
101+
float s0_re = src_re[0] + src_re[2];
102+
float s1_re = src_re[0] - src_re[2];
103+
float s2_re = src_re[1] + src_re[3];
104+
float s3_re = src_re[1] - src_re[3];
105+
106+
float s0_im = src_im[0] + src_im[2];
107+
float s1_im = src_im[0] - src_im[2];
108+
float s2_im = src_im[1] + src_im[3];
109+
float s3_im = src_im[1] - src_im[3];
110+
111+
dst_re[0] = (s0_re + s2_re) * 0.25f;
112+
dst_re[1] = (s1_re - s3_im) * 0.25f;
113+
dst_re[2] = (s0_re - s2_re) * 0.25f;
114+
dst_re[3] = (s1_re + s3_im) * 0.25f;
115+
116+
dst_im[0] = (s0_im + s2_im) * 0.25f;
117+
dst_im[1] = (s1_im + s3_re) * 0.25f;
118+
dst_im[2] = (s0_im - s2_im) * 0.25f;
119+
dst_im[3] = (s1_im - s3_re) * 0.25f;
120120
}
121121
else if (rank == 1)
122122
{
@@ -256,7 +256,8 @@ namespace lsp
256256

257257
packed_unscramble_reverse(dst, rank);
258258
}
259-
}
260-
}
259+
260+
} /* namespace neon_d32 */
261+
} /* namespace lsp */
261262

262263
#endif /* PRIVATE_DSP_ARCH_ARM_NEON_D32_FFT_H_ */

include/private/dsp/arch/x86/avx/fft.h

+5-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*
2-
* Copyright (C) 2020 Linux Studio Plugins Project <https://lsp-plug.in/>
3-
* (C) 2020 Vladimir Sadovnikov <[email protected]>
2+
* Copyright (C) 2025 Linux Studio Plugins Project <https://lsp-plug.in/>
3+
* (C) 2025 Vladimir Sadovnikov <[email protected]>
44
*
55
* This file is part of lsp-dsp-lib
66
* Created on: 31 мар. 2020 г.
@@ -270,5 +270,6 @@ namespace lsp
270270

271271
dsp::normalize_fft2(dst_re, dst_im, rank);
272272
}
273-
}
274-
}
273+
274+
} /* namespace avx */
275+
} /* namespace lsp */

src/test/utest/fft/fft.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ UTEST_BEGIN("dsp.fft", fft)
8989

9090
for (int same=0; same<2; ++same)
9191
{
92-
for (size_t rank=6; rank<=16; ++rank)
92+
for (size_t rank=2; rank<=16; ++rank)
9393
{
9494
size_t count = 1 << rank;
9595
for (size_t mask=0; mask <= 0x0f; ++mask)

0 commit comments

Comments
 (0)