Ім'я файлу: DSPLab3.docx
Розширення: docx
Розмір: 53кб.
Дата: 21.06.2020
скачати

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ

НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ "ЛЬВІВСЬКА ПОЛІТЕХНІКА"
Інститут КНІТ

Кафедра ПЗ

ЗВІТ

До лабораторної роботи № 3

З дисципліни: “ Цифрова обробка сигналів

На тему: Дискретне перетворення Фур’є

Лектор:

Гавриш В.І.
Виконав:

ст. гр. ПЗ-34

Третяков К.В.
Прийняв:

Коцун В.І.
« ____ » ________ 2019 р.

∑= ________________

Львів-2020

Тема: Дискретне перетворення Фур’є

Мета: Розробити комп’ютерну програму для виконання дискретного перетворення Фур’є (ДПФ) та оберненого дискретного перетворення Фур’є (ОДПФ).

Завдання

Реалізувати на мові програмування С++ (за згодою керівника лабораторних занять можна використати іншу мову програмування):

1. Підпрограму (процедуру чи функцію), що виконуватиме обчислення одного ( k -го) члена ряду Фур’є для ДПФ:

a. Студенти з парними номерами: у тригонометричній формі.

b. Студенти з непарними номерами: у експоненціальній формі.

2. Підпрограму (процедуру чи функцію), що обчислюватиме коефіцієнт Фур’є як суму ряду з N членів.

3. Підпрограму (процедуру чи функцію) для обчислення усіх N компонентів ДПФ.

4. При складанні підпрограм оцінювати такі показники:

a. Час обчислення.

b. Кількість операцій (множення, додавання).

5. Головну програму для обчислення ДПФ з довільною вхідною множиною значень сигналу.

6. Передбачити модифікацію підпрограм з п.1-5, що буде обчислювати як пряме ДПФ так і ОДПФ.

Оформити звіт про виконання лабораторної роботи.

Хід роботи

App.py

from utils.reader import read_input_values

from utils.dft import dft, idft, calculate_dft_operation_count, calculate_idft_operation_count
input_values = read_input_values()

print(f"Input values: {input_values}")

print()
dft_output_values = dft(input_values)

print(f"DFT output values: {dft_output_values}")

print(f"DFT operation count: {calculate_dft_operation_count(len(input_values))}")

print()
idft_output_values = idft(dft_output_values)

print(f"IDFT output values: {idft_output_values}")

print(f"IDFT operation count: {calculate_idft_operation_count(len(input_values))}")
reader.py
from typing import List
DEFAULT_VALUES = [0.3536, 0.3536, 0.6464, 1.0607, 0.3536, -1.0607, -1.3536, -0.3536]

def read_input_values() -> List[float]:

if input("Do you want default input values (y/n): ").strip().lower() == 'y':

return DEFAULT_VALUES
print("Write END for finishing writing values")
result = []
while True:

value = input("Enter value: ")
if value.strip() == "END":

break
if is_float(value):

result.append(float(value))

else:

print("Invalid value")
return result

def is_float(val):

try:

num = float(val)

except ValueError:

return False

return True
duration_calculator.py

from typing import Callable

from datetime import datetime

def duration_calculator(func: Callable) -> Callable:

def wrapper(*args, **kwargs):

start = datetime.now()

result = func(*args, **kwargs)

print_duration(start, datetime.now())
return result
return wrapper

def print_duration(start: datetime, end: datetime):

elapsed_time = end - start

print(f"Start at {start}, finished at {end}, elapsed time {elapsed_time.total_seconds()}s")
dft.py

from typing import List, Dict

from math import sin, cos, pi

from utils.complex import Complex

from utils.duration_calculator import duration_calculator

@duration_calculator

def dft(values: List[float]) -> List[Complex]:

result = []
for i in range(len(values)):

value = Complex()
for j in range(len(values)):

value.real += values[j] * cos(2 * pi * i * j / len(values))

value.img -= values[j] * sin(2 * pi * i * j / len(values))
result.append(value)
return result

@duration_calculator

def idft(values: List[Complex]) -> List[float]:

result = []
for i in range(len(values)):

value = 0.0
for j in range(len(values)):

value += (values[j].real * cos(2 * pi * i * j / len(values))) - (values[j].img * sin(2 * pi * i * j / len(values)))
result.append(value / len(values))
return result

def calculate_dft_operation_count(value_count: int) -> Dict:

return {

"+": value_count * value_count,

"-": value_count * value_count,

"*": value_count * value_count * 8,

"/": value_count * value_count * 2,

"sin": value_count * value_count,

"cos": value_count * value_count

}

def calculate_idft_operation_count(value_count: int) -> Dict:

return {

"+": value_count * value_count,

"-": value_count * value_count,

"*": value_count * value_count * 8,

"/": value_count * value_count * 2 + value_count,

"sin": value_count * value_count,

"cos": value_count * value_count

}



Рис.1. Демонстрація роботи програми

Висновок

Виконуючи цю лабораторну роботу, я розробив комп’ютерну програму для виконання дискретного перетворення Фур’є (ДПФ) та оберненого дискретного перетворення Фур’є (ОДПФ).
скачати

© Усі права захищені
написати до нас