Быстрое преобразование Фурье: ошибка «неопределенная ссылка» с использованием шаблонных производных классов, даже если заголовок и файл .cpp совпадают - PullRequest
1 голос
/ 28 апреля 2019

Я кодирую алгоритм быстрого преобразования Фурье, который рекурсивно использует метод Кули Тьюки, используя сложные векторы. Файл заголовка и файл .cpp совпадают по имени и синтаксису параметра, но я получаю ошибку «неопределенная ссылка». Из-за "дополнительного" параметра распределителя, упомянутого в ошибке. Я думаю, что это может быть связано с использованием шаблона для нашего абстрактного базового класса и производного класса Cooley-tukey. Все проблемы связаны с функцией FFF_REC, которая рекурсивно разделяет входные данные.

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 Ответ

0 голосов
/ 28 апреля 2019

Вы создаете массив векторов как 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(), вы получите исключение, когда оно выходит за пределы.

...