Лабораторная работа: Дискретное преобразование Фурье

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

[Введите текст]

МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ

ФГБОУ ВО АЛТАЙСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ

Физико-технический факультет

Кафедра вычислительной техники и электроники (ВТиЭ)

Лабораторная работа № 3

Дискретное преобразование Фурье (ДПФ)

Барнаул 2019

В данной лабораторной я работаю с различными типами фильтров и получаю для них основные характеристики.

Расчет параметров для нерекурсивного фильтра. Порядок фильтра L=10.

В данном пункте я рассчитываю параметры для однородного нерекурсивного фильтра путем обычной подстановки значений в данную формулу и тем самым получаются теоретически рассчитанные значения AЧХ, а второй частью этого задания будет получение реальных значений АЧХ путем подачи на вход фильтра дельта функции, а так же пропуская рассчитанные значения через быстрое преобразование Фурье, в конце по рассчитанным коэффициентам строятся следующие графики:

Рис. 1 - График теоретически рассчитанной АЧХ

Рис. 2 - График реальной рассчитанной АЧХ

На данных графиках ясно видно, что средняя амплитуда сигнала по мере возрастания частоты сигнала будет уменьшаться, поэтому данный фильтр является фильтром нижних частот.

Расчет параметров для рекурсивного фильтра. Порядок фильтра L=12.

В данном пункте я рассчитываю параметры для рекурсивного фильтра путем обычной подстановки в формулу значений, тем самым получаются значения по которым строится следующий график.

Рис. 3 - График теоретически рассчитанной АЧХ

Данный график характеризуется спадом амплитуды по мере увеличения частоты следовательно это фильтр нижних частот.

В данном пункте я рассчитываю реальную АЧХ рекурсивного однородного фильтра путем подачи на вход дельта функции и путем анализа спектра с помощью быстрого преобразования Фурье.

Рис. 4 - График реальной АЧХ ОРФ

В данном пункте я работаю непосредственно с фильтром и сигналам которые необходимо подавить.

Я пропустил сигнал частотой 190 Гц, который теоретически обязан быть подавленным фильтром и получил следующее:

Рис. 5 - График исходного сигнала

Рис. 6 - График сигнала пропущенного через однородный нерекурсивный фильтр

Рис. 7 - График реальной АЧХ фильтра высоких частот

В данном пункте я работаю с фильтром высоких частот

Я пускаю на вход фильтра верхних частот дельта функцию, а затем анализирую с помощью быстрого преобразования Фурье.

Рис. 8 - График теоретической АЧХ фильтра высоких частот

В данном пункте я работаю с триангулярным фильтром

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

Рис. 9 - График реальной АЧХ однородного фильтра

сигнал фильтр частота

В данном пункте я собственно осуществляю применение однородного нерекурсивного фильтра к реальному сигналу с шумом.

Рис. 10 - График реальной АЧХ однородного фильтра

Рис. 11 - График исходного сигнала с шумом

Рис. 12 - График отфильтрованного сигнала

Спектр исходного сигнала с шумом

Рис. 14 - Спектр отфильтрованного сигнала

Приложение 1

#include "stdafx.h"

#include <iostream>

#include <fstream>

using namespace std;

int main()

{

ofstream afcrealf("afcreal.txt");

ofstream afcidealf("afcideal.txt");

double w = 0, afcreal = 0, afcideal = 0, afcrealm[500];

int i = 500, j = 0, count = 0, L = 10,l;

for (j = 0; j < i; j++)

{

if (j == 1)

afcrealm[1] = 1;

else

afcrealm[j] = 0;

}

for (j = 0; j < i; j++)

{

for (l = 0; l <L; l++)

{

if (j - l>=0)

afcreal += afcrealm[j - l];

}

cout<< afcreal / L << endl;

afcrealf << afcreal / L << endl;

afcreal = 0;

}

for (w = 0; w <= 1; w += 0.002)

{

for (count = 0; count <= (L / 2 - 1); count++)

{

afcideal += cos(2 * 3.14*w*count - 3.14*w*(L - 1));

}

//cout << 2 * afcideal / l << endl;

afcidealf << 2 * afcideal / L << endl;

afcideal = 0;

}

system("pause");

return 0;

}

Команды использованные в Octave

load afcideal.txt

load afcreal.txt

y=fft(afcreal)

plot(0.002:0.002:1,real(abs(y)),"r",0.002:0.002:1,real(abs(afcideal))+0.01,"g") сдвиг на 0.01 нужен для того чтобы графики не сливались.

Приложение 2

#include "stdafx.h"

#include <iostream>

#include <math.h>

#include <fstream>

#include <stdio.h>

using namespace std;

int main()

{

ofstream afcrealf("afcreal2.txt");

ofstream afcidealf("afcideal2.txt");

double w = 0, x = 0, afcideal = 0, input[1000], yn[1000], L = 20;

int i = 0, j = 0,n, l;

while (i<500)

{

if (i == 1)

input[i] = 1;

else

input[i] = 0;

yn[i] = 0;

i++;

}

for (n = 0; n < i; n++)

{

for (l = 0; l<L; l++) {

if (n - l > 0)

yn[n] = yn[n - 1] + input[n] - input[n - l];

}

yn[n]=yn[n] / L;

afcrealf << yn[n] << endl;

cout<< yn[n] << endl;

}

for (w = 0.001; w <= 1.001; w += 0.001)

{

afcideal = sin(3.1415*L*w) / sin(3.1415*w) / L;

afcidealf << afcideal << endl;

//cout << afcideal << endl;

afcideal = 0;

}

system("pause");

return 0;

}

Команды использованные в Octave

load afcreal2.txt

load afcideal2.txt

y=fft(afcreal2)

plot(0.001:0.001:1,real(abs(afcideal2)),"r")

plot(0.002:0.002:1,real(abs(y)),"r")

Приложение 3

#include "stdafx.h"

#include <iostream>

#include <math.h>

#include <fstream>

#include <stdio.h>

using namespace std;

int main()

{

ofstream sinout("sinout.txt");

ofstream sinf("sin.txt");

double yout = 0, ysin[1000], buffer[1000], L = 10,k=0;

int i = 0, j = 0,l;

while (i<100)

{

k += 0.001;

ysin[i] = sin(2 * 3.14159265 * 190 * k ); //частота 200гц

//cout << afcrealm[i] << endl;

sinf << ysin[i] << endl;

i++;

}

for (j = 0; j < i; j++)

{

for (l = 0; l <L; l++)

{

if ((j - l) >= 0) {

yout += ysin[j - l];

}

}

cout << yout / L << endl;

sinout << yout / L << endl;

yout = 0;

}

system("pause");

return 0;

}

Команды использованные в Octave

load sinout.txt

load sin.txt

plot(0.001:0.001:0.1,sin,"r")

plot(0.001:0.001:0.1,sinout,"r")

Приложение 4

#include "stdafx.h"

#include <iostream>

#include <math.h>

#include <fstream>

#include <stdio.h>

#include <cmath>

using namespace std;

int main()

{

ofstream real("real.txt");

double w = 0, afcreal = 0, afcideal = 0, afcrealm[100], L = 10;

int i = 0, j = 0, l = 0;

while (i<50)

{

if (i == 0)

afcrealm[i] = 1;

else

afcrealm[i] = 0;

i++;

}

for (j = 0; j < i; j++)

{

for (l = 0; l <L; l++)

{

if ((j - l) >= 0) {

if (!(j % 2 == 0))

afcreal -= afcrealm[j - l];

else

afcreal += afcrealm[j - l];

}

}

//cout<<afcreal/ L <<endl;

real << afcreal / L << endl;

afcreal = 0;

}

system("pause");

return 0;

}

Команды использованные в Octave

load real.txt

y=fft(real)

plot(0.02:0.02:1,abs(y))

for i=1:26;

teor(i,1)=y(i);

endfor

x=0.5:0.02:1

plot(x,abs(teor))

Приложение 5

#include "stdafx.h"

#include <iostream>

#include <fstream>

using namespace std;

int main()

{

ofstream afcrealf("real.txt");

ofstream filterOne("filterOne.txt");

double w = 0, filter = 0, afcideal = 0, input[1000], input2[1000];

int i = 0, j = 0, count = 0, l = 10;

while (i<100)

{

if (i ==0)

input[i] = 1;

else

input[i] = 0;

i++;

}

for (j = 0; j < i; j++)

{

for (count = l-1; count >= 0; count--)

{

if (j - count>=0)

filter += input[j - count];

}

input2[j]= filter / l;

filterOne << filter / l << endl;

filter = 0;

}

for (j = 0; j < i; j++)

{

for (count = l-1; count >= 0; count--)

{

if (j - count>=0)

filter += input2[j - count];

}

afcrealf << filter / l << endl;

cout << filter / l << endl;

filter = 0;

}

system("pause");

return 0;

}

Команды использованные в Octave

load real.txt

load filterOne.txt

y=fft(real)

y0=fft(real)

plot(0.01:0.01:1,abs(y0))

plot(0.01:0.01:1,abs(y))

Приложение к заданию 6

#include "stdafx.h"

#include <iostream>

#include <math.h>

#include <fstream>

#include <stdio.h>

using namespace std;

int main()

{

ifstream noize("noised.dat");

ofstream out("output.txt");

ofstream input("input.txt");

float noize_a[500],filter=0;

int i=0, n=0, L=10;

while (i<500)

{

noize >> noize_a[i];

i++;

}

for (n = 0; n < i; n++)

{

for (int l=0; l<= L;l++)

{

if (n - l>=0)

filter += noize_a[n - l];

}

out << filter / L << endl;

input << noize_a[n] << endl;

filter = 0;

}

system("pause");

return 0;

}

Команды в Octave

load output.txt

load input.txt

plot (1:1:500, input)

plot (1:1:500, output)

in=fft(input)

out=fft(output)

bar (1:1:500, real(abs(in)))

bar (1:1:500, real(abs(out)))

Источник: https://otherreferats.allbest.ru/download/1181824/