当前位置: 首页 > 知识库问答 >
问题:

快速傅立叶变换:使用模板派生类“未定义引用”错误,即使头文件和.cpp文件匹配

申炳
2023-03-14

GitHub:https://github.com/programmerb/fourier-transform-terminal-/blob/master/classes/cooley-tukey.h

我已经尝试将参数更改为引用,并将私有成员添加到cooley-tukey类中,但我得到了同样的错误。

库利-图基类:

template<typename T>
class Cooley_tukey: protected Fourier<T>{
public:
    Cooley_tukey();
    Cooley_tukey(std::string file_name, double frequency, double, 
      frequency_step, std::string output_name);
    //~Cooley_tukey();

    void FFT(const std::vector<T> &index, const std::vector<T> &value);

    std::vector<complex<T>> FFT_REC(std::vector<complex<T>> &temp, int 
      total_time); //recursion function for FFT

private:
    int total_time;

部分错误:

classes\cooley-tukey.cpp:91:10: error: no matching function for call to 
'Cooley_tukey<double>::FFT_REC(std::vector<std::complex<double>, 
std::allocator<std::complex<double> > > [(total_time / 2)], int, 
std::vector<std::complex<double>, std::allocator<std::complex<double> > 
>&)'FFT_REC(odd, total_time/2, result);

FFT-递归函数(误差来源):

    template<typename T>
    std::vector<complex<T>> Cooley_tukey<T>::FFT_REC(std::vector<complex<T>>& temp, int total_time)
    {
        // Check if it is split up enough
        if (total_time >= 2)
        {

            // Split even and odds up
            std::vector<complex<T>> odd[total_time/2];
            std::vector<complex<T>> even[total_time/2];
            for (int i = 0; i < total_time / 2; i++)
            {
                even->at(i) = temp.at(i*2);
                odd->at(i)  = temp.at(i*2+1);
            }

            // Split up tasks through FFT recursion method
            FFT_REC(even, total_time/2);
            FFT_REC(odd, total_time/2);


            // DFT portion of FFT - calculates after everything has been split up through FFT_REC
            for (int frequency = 0; frequency < total_time / 2; frequency += this->frequency_step)
            {
                std::complex<T> t = exp(std::complex<T>(0, -2 * M_PI * frequency / total_time)) * odd->at(frequency);

                //Result of Cooley-Tukey algorithm:
                    //*This gives us the frequency values at certain times
                temp.at(frequency) = even->at(frequency) + t;
                temp.at(total_time / 2 + frequency) = even->at(frequency) - t;

            }
        }
        return temp;
    }

    template class Cooley_tukey<double>;

共有1个答案

管峻
2023-03-14

您将创建一个even/odd的向量数组,而您应该只有一个向量。错误表示没有一个方法接受向量数组。

我想你的意思是:

// Split even and odds up
std::vector<complex<T>> odd;
std::vector<complex<T>> even;
odd.reserve(total_time/2);
even.reserve(total_time/2);
for (int i = 0; i < total_time / 2; i++)
{
    even.push_back(temp.at(i*2));
    odd.push_back(temp.at(i*2+1));
}

您还尝试使用at()将值设置为空向量,这会导致错误。向量可能没有分配任何存储空间,如果您试图用at()对它们进行索引,当它超出界限时将会得到一个异常。

 类似资料:
  • 目标 在这一节中,我们将学习 使用OpenCV查找图像的傅立叶变换 利用Numpy中的FFT功能 傅立叶变换的一些应用 我们将学到以下函数:cv2.dft(),cv2.idft()等 理论 傅立叶变换用于分析各种滤波器的频率特性。对于图像,可以使用2D离散傅里叶变换(DFT)来查找频域。被称为快速傅立叶变换(FFT)的快速算法被用于DFT的计算。有关这些的细节可以在任何图像处理或信号处理的教科书中

  • 我有一个8000 Hz采样率的单通道波。 我需要实时分析5赫兹到300赫兹之间的频率,重点是10到60赫兹的信号。 我最初的想法是将8000 Hz的样本放入缓冲区,收集大约32000个样本。然后,在其上运行32000窗口大小的傅立叶变换。 这里的理由是,对于低频信号,您需要更大的窗口大小(对吗?) 然而,如果我试图实时显示这个信号,那么AudioAnalyzerNode似乎不是一个好的选择。我知道

  • 问题内容: 我正在尝试渲染文件。该文件存在于我的项目中,但是当我尝试渲染它时,我一直在获取文件。Flask为什么找不到我的模板? 问题答案: 必须在正确的位置创建模板文件。在你的python模块旁边的子目录中。 该错误表明目录中没有文件。确保在与模块相同的目录中创建了该目录,并且确实将文件放在该子目录中。如果你的应用是软件包,则应在软件包内创建模板文件夹。 另外,如果你将模板文件夹命名为templ

  • 问题内容: 我正在尝试渲染文件。该文件存在于我的项目中,但是当我尝试渲染它时,我一直在获取文件。Flask为什么找不到我的模板? 问题答案: 你必须在正确的位置创建模板文件。在你的模块旁边的子目录中。 该错误表明目录中没有文件。确保在与python模块相同的目录中创建了该目录,并且确实将文件放在该子目录中。如果你的应用是软件包,则应在软件包内创建模板文件夹。 另外,如果你将模板文件夹命名为而不是其

  • 目标 在本节中,我们将学习 使用OpenCV查找图像的傅立叶变换 利用Numpy中可用的FFT函数 傅立叶变换的某些应用程序 我们将看到以下函数:cv.dft(),cv.idft()等 理论 傅立叶变换用于分析各种滤波器的频率特性。对于图像,使用2D离散傅里叶变换(DFT)查找频域。一种称为快速傅立叶变换(FFT)的快速算法用于DFT的计算。关于这些的详细信息可以在任何图像处理或信号处理教科书中找

  • template module在Ansible中非常常用,而它在使用的时候又没有显示的指定template文件中的值,所以有时候用户会对template文件中使用的变量感到困惑,所以在这里又重新强调下。 template变量的定义 在playbook中定义的变量,可以直接在template中使用,同时facts变量也可以直接在template中使用,当然也包含在inventory里面定义的host