46 lines
1.6 KiB
C
46 lines
1.6 KiB
C
#include "c_Test.h"
|
|||
|
|
#include "c_FFT.h"
|
||
|
|
|
||
|
|
TEST_CASE(test_fft_forward_and_inverse_precision) {
|
||
|
|
c_size_t N = 8;
|
||
|
|
c_FFT_t fft;
|
||
|
|
c_err_t err = c_FFT_Init(&fft, N, NULL);
|
||
|
|
ASSERT_INT_EQ(C_SUCCESS, err);
|
||
|
|
|
||
|
|
/* Allocate and initialize a test complex input signal (e.g., a simple square pulse) */
|
||
|
|
c_Complex_t signal[8] = {
|
||
|
|
{1.0, 0.0}, {1.0, 0.0}, {1.0, 0.0}, {1.0, 0.0},
|
||
|
|
{0.0, 0.0}, {0.0, 0.0}, {0.0, 0.0}, {0.0, 0.0}
|
||
|
|
};
|
||
|
|
|
||
|
|
/* Backup the original signal vector values for accuracy verification tests later */
|
||
|
|
double original_real[8];
|
||
|
|
for (c_size_t i = 0; i < N; ++i) original_real[i] = signal[i].real;
|
||
|
|
|
||
|
|
/* 1. Execute Forward Fourier Transformation */
|
||
|
|
err = c_FFT_Execute(&fft, signal, C_FALSE);
|
||
|
|
ASSERT_INT_EQ(C_SUCCESS, err);
|
||
|
|
|
||
|
|
/* The DC component (index 0) must equal the sum of all elements = 4.0 */
|
||
|
|
ASSERT_DOUBLE_EQ_MSG(4.0, signal[0].real, "Forward FFT DC component calculation wrong");
|
||
|
|
|
||
|
|
/* 2. Execute Inverse Fourier Transformation to reconstruct the original signal */
|
||
|
|
err = c_FFT_Execute(&fft, signal, C_TRUE);
|
||
|
|
ASSERT_INT_EQ(C_SUCCESS, err);
|
||
|
|
|
||
|
|
/* Confirm that the output matches the original input wave precisely within allowed errors */
|
||
|
|
for (c_size_t i = 0; i < N; ++i) {
|
||
|
|
ASSERT_DOUBLE_EQ_MSG(original_real[i], signal[i].real, "FFT-IFFT signal precision mismatch");
|
||
|
|
ASSERT_DOUBLE_EQ_MSG(0.0, signal[i].imag, "Residual imaginary noise caught in reconstructed signal");
|
||
|
|
}
|
||
|
|
|
||
|
|
c_FFT_Destroy(&fft);
|
||
|
|
}
|
||
|
|
|
||
|
|
int main(void) {
|
||
|
|
TEST_START(FastFourierTransform_Engine_Suite);
|
||
|
|
RUN_TEST(test_fft_forward_and_inverse_precision);
|
||
|
|
TEST_REPORT();
|
||
|
|
RETURN_TEST_STATUS;
|
||
|
|
}
|