You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

60 lines
1.6 KiB

  1. extern crate assert;
  2. extern crate complex;
  3. extern crate fft;
  4. use complex::c64;
  5. mod fixtures;
  6. #[test]
  7. fn complex_forward() {
  8. let mut data = fixtures::TIME_DATA.to_vec();
  9. fft::complex::forward(as_c64_mut(&mut data));
  10. assert::close(&data, &fixtures::FREQUENCY_DATA_FOR_COMPLEX[..], 1e-14);
  11. }
  12. #[test]
  13. fn complex_inverse() {
  14. let mut data = fixtures::FREQUENCY_DATA_FOR_COMPLEX.to_vec();
  15. fft::complex::inverse(as_c64_mut(&mut data));
  16. assert::close(&data, &fixtures::TIME_DATA[..], 1e-14);
  17. }
  18. #[test]
  19. fn real_forward() {
  20. let mut data = fixtures::TIME_DATA.to_vec();
  21. {
  22. let mut data = to_c64(&data);
  23. fft::complex::forward(&mut data);
  24. assert::close(as_f64(&data), &fixtures::FREQUENCY_DATA_FOR_REAL_UNPACKED[..], 1e-13);
  25. }
  26. {
  27. fft::real::forward(&mut data);
  28. assert::close(&data, &fixtures::FREQUENCY_DATA_FOR_REAL[..], 1e-13);
  29. let data = fft::real::unpack(&data);
  30. assert::close(as_f64(&data), &fixtures::FREQUENCY_DATA_FOR_REAL_UNPACKED[..], 1e-13);
  31. }
  32. }
  33. #[test]
  34. fn real_inverse() {
  35. let mut data = fixtures::FREQUENCY_DATA_FOR_REAL.to_vec();
  36. fft::real::inverse(&mut data);
  37. assert::close(&data, &fixtures::TIME_DATA[..], 1e-14);
  38. }
  39. fn as_f64<'l>(slice: &'l [c64]) -> &'l [f64] {
  40. unsafe {
  41. std::slice::from_raw_parts(slice.as_ptr() as *const _, 2 * slice.len())
  42. }
  43. }
  44. fn as_c64_mut<'l>(slice: &'l mut [f64]) -> &'l mut [c64] {
  45. unsafe {
  46. std::slice::from_raw_parts_mut(slice.as_mut_ptr() as *mut _, slice.len() / 2)
  47. }
  48. }
  49. fn to_c64(slice: &[f64]) -> Vec<c64> {
  50. slice.iter().map(|&re| c64(re, 0.0)).collect()
  51. }