【问题标题】:abs() returns the same output for different FFT inputsabs() 为不同的 FFT 输入返回相同的输出
【发布时间】:2021-05-26 21:57:49
【问题描述】:

我有 1024 个样本,为了对其执行 FFT,我将其分成 32 个块,以下是 FFT 的输出:

(3.13704,2.94588) (12.9193,14.7706) (-4.4401,-6.21331) (-1.60103,-2.78147) (-0.84114,-1.86292) (-0.483564,-1.43068) (-0.272469,-1.17551) (-0.130891,-1.00437) (-0.0276415,-0.879568) (0.0523422,-0.782884) (0.117249,-0.704425) (0.171934,-0.638322) (0.219483,-0.580845) (0.261974,-0.529482) (0.300883,-0.48245) (0.337316,-0.438409) (0.372151,-0.396301) (0.40613,-0.355227) (0.439926,-0.314376) (0.474196,-0.27295) (0.509637,-0.23011) (0.54704,-0.184897) (0.587371,-0.136145) (0.631877,-0.0823468) (0.682262,-0.021441) (0.740984,0.0495408) (0.811778,0.135117) (0.900701,0.242606) (1.01833,0.384795) (1.18506,0.586337) (1.44608,0.901859) (1.92578,1.48171)

(-3.48153,2.52948) (-16.9298,9.92273) (6.93524,-3.19719) (3.0322,-1.05148) (1.98753,-0.477165) (1.49595,-0.206915) (1.20575,-0.047374) (1.01111,0.0596283) (0.869167,0.137663) (0.759209,0.198113) (0.669978,0.247168) (0.594799,0.288498) (0.52943,0.324435) (0.471015,0.356549) (0.417524,0.385956) (0.367437,0.413491) (0.319547,0.439819) (0.272834,0.4655) (0.226373,0.491042) (0.17926,0.516942) (0.130538,0.543728) (0.0791167,0.571997) (0.0236714,0.602478) (-0.0375137,0.636115) (-0.106782,0.674195) (-0.18751,0.718576) (-0.284836,0.772081) (-0.407084,0.839288) (-0.568795,0.928189) (-0.798009,1.0542) (-1.15685,1.25148) (-1.81632,1.61402)

(-1.8323,-3.89383) (-6.57464,-18.4893) (1.84103,7.4115) (0.464674,3.17552) (0.0962861,2.04174) (-0.0770633,1.50823) (-0.1794,1.19327) (-0.248036,0.982028) (-0.29809,0.827977) (-0.336865,0.708638) (-0.368331,0.611796) (-0.394842,0.530204) (-0.417894,0.459259) (-0.438493,0.395861) (-0.457355,0.337808) (-0.475018,0.283448) (-0.491906,0.231473) (-0.508378,0.180775) (-0.524762,0.130352) (-0.541376,0.0792195) (-0.558557,0.0263409) (-0.57669,-0.0294661) (-0.596242,-0.089641) (-0.617818,-0.156045) (-0.642245,-0.231222) (-0.670712,-0.318836) (-0.705033,-0.424464) (-0.748142,-0.55714) (-0.805167,-0.732645) (-0.885996,-0.981412) (-1.01254,-1.37087) (-1.24509,-2.08658)

为了证明它们是不同的值,我只包含了 32 个块中的 3 个块。

在获取此输出并将其提供给 abs() 函数以计算幅度后,我注意到每个块都得到相同的输出! (下例)

4.3034 19.6234 7.63673 3.20934 2.04401 1.51019 1.20668 1.01287 0.880002 0.784632 0.714117 0.661072 0.62093 0.590747 0.568584 0.553159 0.543646 0.539563 0.54071 0.547141 0.559178 0.577442 0.602943 0.63722 0.682599 0.742638 0.822946 0.932803 1.08861 1.32218 1.70426 2.42983

4.3034 19.6234 7.63673 3.20934 2.04401 1.51019 1.20668 1.01287 0.880002 0.784632 0.714117 0.661072 0.62093 0.590747 0.568584 0.553159 0.543646 0.539563 0.54071 0.547141 0.559178 0.577442 0.602943 0.63722 0.682599 0.742638 0.822946 0.932803 1.08861 1.32218 1.70426 2.42983

4.3034 19.6234 7.63673 3.20934 2.04401 1.51019 1.20668 1.01287 0.880002 0.784632 0.714117 0.661072 0.62093 0.590747 0.568584 0.553159 0.543646 0.539563 0.54071 0.547141 0.559178 0.577442 0.602943 0.63722 0.682599 0.742638 0.822946 0.932803 1.08861 1.32218 1.70426 2.42983

为什么我从不同的输入中得到完全相同的输出?这正常吗?

这是我正在执行所有这些计算的代码的一部分:

int main(int argc, char** argv)
{
    int i;
    double y;
    const double Fs = 100;//How many time points are needed i,e., Sampling Frequency
    const double  T = 1 / Fs;//# At what intervals time points are sampled
    const double f = 4;//frequency
    int chuck_size = 32; // chunk size (N / 32=32 chunks)
    Complex chuck[32];
    int j = 0;
    int counter = 0;
    for (int i = 0; i < N; i++)
    {
        t[i] = i * T;
        in[i] = { (0.7 * cos(2 * M_PI * f * t[i])), (0.7 * sin(2 * M_PI * f * t[i])) };// generate (complex) sine waveform
        chuck[j] = in[i];
        //compute FFT for each chunk
        if (i + 1 == chuck_size) // for each set of 32 chunks, apply FFT and save it all in a 1d array (magnitude)
        {
            chuck_size += 32;
            CArray data(chuck, 32);
            fft(data);
            j = 0;
            for (int h = 0; h < 32; h++)
            {
                magnitude[counter] = abs(data[h]);
                std::cout << abs(data[h]) << " ";
                counter++;
            }
            printf("\n\n");

        }
        else
            j++;
    }
}

频谱图(归一化):

【问题讨论】:

  • 首先,我问一般,这是正常的行为吗? @463035818_is_not_a_number
  • 我添加了我的代码
  • 你能让它完整到足以实际编译吗?如果没有人可以重现您的问题,我们甚至无法看到您的所有代码在做什么,那么您如何希望获得比猜测更好的帮助? 't'、Complex、CArray、cos、magnitude、fft、N、in 等是什么?实际上,这是太多的代码。您的错误可能在任何地方。将其分解为最小的、可展示的但完整的东西,这仍然代表了问题。此外,一个指向 godbolt 示例的链接也会有所帮助。

标签: c++ fft absolute-value


【解决方案1】:

您的信号是正弦波。你把它切碎。每个段将具有相同的频率分量,只是不同的相位(偏移)。 FFT 为您提供每个频率分量的幅度和相位,但在abs 之后,仅保留幅度。对于您的所有块,这些量级必须相同。

【讨论】:

  • 哦,最终我将这些幅度保存到 2d 数组中并绘制到 32x32 窗口中以显示频谱图,但它出现了错误,我认为这是问题
  • @yarin 尝试修改信号使其不是静态的,例如生成chirp signal
  • 我编辑了我的帖子并添加了我得到的频谱图的屏幕截图,你觉得这看起来正常吗?
  • @yarin 它看起来像您的显示剪辑,将任何高于 1 的内容显示为白色。您可能希望在显示之前进行标准化。
  • 哇,我不知道你是怎么发现的,我使用 openGL,我认为颜色的范围是 0-255,现在我只需要意识到如何将它标准化为 0- 1 个范围,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多