gpt4 book ai didi

c - 16 位短(实)跨步数据的 FFT

转载 作者:太空宇宙 更新时间:2023-11-04 01:54:04 26 4
gpt4 key购买 nike

我需要计算像这样存储的 2 个短数据数组的 FFT(重复百万次): Data distribution in memory等等。

数组值用黄色和蓝色表示。每个 K 值都有一个大小为 K 的未使用数据空间,我需要跳过。

我对数据进行了重新排序(和 float 转换)以去除无用的值,并使用 FFTW(使用 c)来计算所需的转换。

关于这个过程我有两个问题。

  1. 有没有办法使用 inistrideidist 参数(如 in the documentation 所示)按原样使用数组(无需重新排序,仅转换为 float )?我想没有,但也许我已经筋疲力尽了。
  2. 是否有任何好的库可以使用短数据作为输入来计算 fft?我很乐意用一些精度来换取显着的加速。此代码将在 i7 上运行。

最佳答案

我是 KISS FFT 的非常满意的用户马克博格丁。它有一个整数变换,还有一个纯实数变换,利用纯实值输入变换中固有的厄米特对称性来减少所需的计算量。

但是,您需要自己跟踪数据位置。该接口(interface)非常简单,只需要一个指向内部数据缓冲区的指针,以及输入和输出缓冲区地址。

假设您的输入是实数,您可以这样做:

//Must compile with -DFIXED_POINT=16 directive,
//to tell kiss_fft to do fixed-point transforms with short int data

#include "kiss_fft.h"
#include "kiss_fftr.h"

const size_t K = ...;
const size_t inSize = K/6; //6 based on your diagram above, adjust as needed

kiss_fft_scalar *inBuf = bigInputBuffer;
kiss_fft_cpx outBuf[1+inSize/2]; //Hermitian symmetry, so DC + N/2 complex outputs
//kiss_fft_cpx outBuf[inSize]; //if not using the real transform
size_t ctr = 0;

kiss_fftr_cfg fftCfg = kiss_fftr_alloc(inSize, false, NULL, NULL);
//kiss_fft_cfg fftCfg = kiss_fft_alloc(inSize, false, NULL, NULL); //if not using the real transform

do {
kiss_fftr(fftCfg, inBuf, outBuf); //kiss_fft(...) is not using the real transform
//do something with outBuf
++ctr;
if (ctr == 6) {
inBuf += K;
ctr = 0;
} else {
inBuf += K/6;
}
} while ((inBuf - bigInputBuffer) < bigBufSize);

注意事项:

  • 您需要重新编译以更改数据类型。对 short 或 int 数据使用 FIXED_POINT=16FIXED_POINT=32,或者不要设置 FIXED_POINT 进行浮点转换。
  • FIXED_POINT 在源代码中必须具有相同的值,kiss_fft.*kiss_fftr.*。因此,要么在所有文件中手动设置它,要么(更好)使用 -D 将其作为编译器指令传递,例如,clang -DFIXED_POINT=16 kiss_fft.c kiss_fftr.c main.c
  • 真正的转换期望输入缓冲区大小是均匀的。
  • 转换期望输入缓冲区的大小是 2,3,5 的乘积。我不记得它是否适用于其他尺寸,但即使适用也会很慢。

关于c - 16 位短(实)跨步数据的 FFT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37596573/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com