Быстрое преобразование Фурье с прореживанием по времени

Автор: Пользователь скрыл имя, 28 Февраля 2012 в 08:19, курсовая работа

Краткое описание

Целью курсовой работы является изучение и освоение методов цифровой обработки сигналов и изображений.

В настоящее время во многих отраслях науки и техники, таких как радиолокация, сейсмография, связь, радиоастрономия, медицинская электроника, цифровая обработка сигналов (ЦОС) приобретает все более широкое применение.

Оглавление

Введение 3

Задание 3

1. Математическое описание задачи 4

1.1 Определение и свойства дискретного преобразования Фурье 4

1.2 Математическое описание БПФ с прореживанием по времени 8

2. Разработка алгоритмов и программы для решения практической задачи 12

2.1 Представление данных 12

2.2 Алгоритм быстрого преобразования Фурье с прореживанием по времени 12

3. Анализ результатов моделирования алгоритма БПФ с прореживанием по времени 14

3.1 Обращение к программе 14

3.2 Входные и выходные параметры 14

3.3 Примеры работы программы 14

Выводы 17

Список литературы 18

Файлы: 1 файл

Курсач по дискретке.docx

— 321.25 Кб (Скачать)

        temp = x(j + 1);     % то меняем местами

        x(j + 1) = x(i);

        x(i) = temp;

    end

end;

 

% главный цикл вычислениЯ  БПФ

m = log2(n);                             % количество операций "бабочка"

for step = 1:m,

    i = 1;           % устанавливаем коэффициенты

    j = 2^(step - 1) + 1;   

    down = j;            % верхняя граница значений I

    count = 1;     % счетчик

    lim = n/2;

    k = 0;            % степень поворачивающего множителя W

    while count <= lim,          % n/2 операции "бабочка"

        xi = x(i);           % запоминаем

        xj = x(j);           % 

        Wkoef = W(2^step,k,dirFFT);   % вычисляем W    

        x(i) = xi + Wkoef*xj;    % находим новые значениЯ

        x(j) = xi - Wkoef*xj;    % выполняем "бабочку"

 

        % вычисляем  следующие i,j,k,

        if i + 1 >= down,   % если граница превышена,

            i = j + 1;       % то вычисляем следующее

            j = i + 2^(step - 1); % преобразование

            down = j;       % заново вычисляем нижнюю границу

            k = 0;           % степень W равна 0

        else            % в противном случае все значения

            i = i + 1;       % увеличиваем

            j = j + 1;       % на 1

            k = k + 1;

        end;

        count = count + 1;     % увеличиваем счетчик на 1

    end;

end;

if dirFFT ~= 0,

    X = x/n;                        % полученный результат при обратном БПФ

else

    X = x;                         % полученный результат при прямом БПФ.

End

 

Текст функции bin_invers

 

function b = bin_invers(a,n),

%--------------------------------------------------------------------------

% Функция вычисления двоично-инверсного  числа 

%--------------------------------------------------------------------------

% Параметры:

%   a        нормальное число

%   n        n-чечное преобразование

% Результаты:

%   b        инверсное число

%--------------------------------------------------------------------------

 

b = 0;                          % занимаем память под результат

N = log2(n);                      % разрядность сетки

for i = 1:N,                      % по количеству разрядов

    b = b*2 + a - 2*fix(a/2);     % добавляем к b остаток от a и умножаем на 2

                                  % т.е. добавляем со сдвигом  влево

                                  % в конец b последнее

                                  % число от  a в двоичном представлении

    a = fix(a/2);                 % сдвигаем a на один разряд вправо

end;                              % a == 0, b == инверсному a числу

 

Текст функции W

 

function y = W(N,k,dirFFT),

%--------------------------------------------------------------------------

% Функция вычисления поворачивающего  множителя W

%--------------------------------------------------------------------------

% Параметры:

%   N        знаменатель в зависимости от "бабочки"

%   k        степень множителя

%   dirFFT   направление преобразования

% Результаты:

%   y        поворачивающий множитель при заданных условиях

%--------------------------------------------------------------------------

 

if dirFFT==1

   y = exp (complex(0,1)*2*pi*k/N);  % обратное преобразование

else

   y = exp (-complex(0,1)*2*pi*k/N);    % прямое преобразование

end

 

Текст функции Reads_Data

 

function reads_data(handles)

% Функция для считывания  значений строковых переменных

 

global N count f % задание глобальных переменных

N=str2double(get(handles.edit1,'String')); % преобразование значения поля edit1 в число

count=str2double(get(handles.edit2,'String')); % преобразование  значения поля edit2 в число

f=zeros(1,count);

str=get(handles.edit3,'String'); %  значение  поля edit3

 

j=1; k=1;

for i=1:length(str)

    if str(i)~=' '

        s(j)=str(i);

        j=j+1;

    else

        f(k)=str2double(s);

        k=k+1;

        s='';

        j=1;

    end;

end;

f(k)=str2double(s);

 

Текст функции Spectral

 

function Spectral(handles)

%--------------------------------------------------------------------------

% главный модуль программы

%--------------------------------------------------------------------------

 

global N count f                       % задание глобальных переменных

time = 0:N - 1;                        % отсчеты времени

x = zeros(1,N);                        % заполнение массива нулями

for i = 1:count

    x = x + sin(2*pi*f(i)*time/N);     % задание функции

end;

 

% вывод исходной функции

axes(handles.axes1);                   % вывод функции в левом окне

plot(time,x);                          % построение исходного графика

grid on;                               % сетка

 

% проверка переключателя  способа

if (get(handles.radiobutton1,'Value')) == 1  

   

    % проверка переключателя направления

    if (get(handles.radiobutton4,'Value')) == 1

       dirFFT = 1;                     % обратное напрвление

       axes(handles.axes1);            % построение графика в левом окне

       x = MyFFT(x,N,0);              

       plot(abs(x),'color', 'g');

       grid on;        

   else

       dirFFT = 0;                     % прямое направление

   end;

    axes(handles.axes2);               % построение преобразованого графика

    x = MyFFT(x,N,dirFFT);             % вычисляем БПФ

    if dirFFT == 1

        plot(time,x,'color','b');

        grid on;                       % сетка

    else

        plot(abs(x),'color', 'g');

        grid on;                       % сетка

    end;

else

    axes(handles.axes2);

    x = fft(x);                        % вычисляем БПФ по определению

    plot(abs(x),'color', 'r');

    grid on;                           % сетка   

end;

 

 


Информация о работе Быстрое преобразование Фурье с прореживанием по времени