#python #fft
Вопрос:
Мне нужно написать функцию, которая вычисляет бпф, и другую, чтобы вычислить бпф составного синусоидального сигнала, а затем построить там спектр фазы и величины. Затем мне нужно использовать те же функции для вычисления fft и dft изображения в оттенках серого. У меня есть функции, и я могу получить преобразования составной синусоидальной волны, но я не уверен, как применить это к изображению. Я считаю, что пиксели на изображении хранятся в виде 2D-массива, где в качестве функции синуса используется только 1D
вот мой код:
import numpy as ny
import matplotlib.pyplot as mplot
import time as tm # used to claculate time taken to perform functions
# Variables
sample_rate = 0
sample_period = 0
time = 0 # Total time
T = 0
n = 0
freq = 0
y = 0 # Used to build signal to apply the DTF to
Y = 0 # Signal after the DTF
#***
# Main
sample_rate = 128
sample_period = 1/sample_rate
time = ny.arange(0,2,sample_period) # Sample set up to got from 0 - 2 seconds
# Signal 1
freq = 1
y = ny.sin(2*ny.pi*freq*time)
# Signal 2
freq = 3
y = 2*ny.sin(2*ny.pi*freq*time)
# Signal 3
freq = 5
y = 3*ny.sin(2*ny.pi*freq*time)
# Signal 4
freq = 7
y = 0.5*ny.sin(2*ny.pi*freq*time)
#time domain plot of signal
mplot.figure(figsize = (6,4))
mplot.plot(time, y, 'b')
mplot.title('Plot of signal y')
mplot.xlabel('Time (s)')
mplot.ylabel('Amplitude')
#mplot.show()
#***
# Functions
# Discrete Fourier Transform
def DFT(y):
n = ny.arange(len(y))
k = n.reshape((len(y), 1))
e = ny.exp(-2j * ny.pi * k * n / len(y))
Y = ny.dot(e,y)
return Y
# Fast Fourier Transform
def FFT(y):
length = len(y)
if length == 1:
return y
else:
even = FFT(y[::2])
odd = FFT(y[1::2])
fact = ny.exp(-2j * ny.pi * ny.arange(length) / length)
Y = ny.concatenate(( even odd*fact[:int(length/2)] , even odd*fact[int(length/2):] )) # Joining the arrays together
return Y
#***
#get DFT of composite signal
dftstart = tm.time()
Y = DFT(y)
dftend = tm.time()
dfttime = dftend - dftstart
# calculate the frequency
n = ny.arange(len(Y))
T = len(Y)/sample_rate
freq = n/T
#plot magnitude spctrum of DTFT of composite signal
mplot.figure(figsize = (6,4))
mplot.stem(freq, abs(Y), 'r')
mplot.title('Discrete Fourier Transform of signal y')
mplot.xlabel('Frequency (Hz)')
mplot.ylabel('DFT Amplitude |Y(e^jw)|')
#mplot.show()
#plot phase response of DFT
mplot.figure(figsize = (6,4))
mplot.plot(freq, Y/abs(Y), 'r')
mplot.title('phase spectrum of DFT of signal y')
mplot.xlabel('Frequency (Hz)')
mplot.ylabel('Phase(rad/s)')
#get fft of composite signal
fftstart = tm.time()
Y = FFT(y)
fftend = tm.time()
ffttime = fftend - fftstart
# calculate the frequency
length = len(Y)
n = ny.arange(length)
T = len(Y)/sample_rate
freq = n/T
#plot magnitude spectrum of fft of composite signal
mplot.figure(figsize = (6,4))
mplot.stem(freq, abs(Y), 'r')
mplot.title('Fast Fourier Transform of signal y')
mplot.xlabel('Frequency (Hz)')
mplot.ylabel('FFT Amplitude |X(e^jw)|')
#mplot.show()
#plot phase response of fft
mplot.figure(figsize = (6,4))
mplot.plot(freq, Y/abs(Y), 'b')
mplot.title('phase response of FFT of signal y')
mplot.xlabel('Frequency (Hz)')
mplot.ylabel('Phase(rad/s)')
mplot.show()
print("time to execute dft: " str(dfttime))
print("time to execute fft: " str(ffttime))
Если бы кто-нибудь мог посоветовать мне, как применить это к изображению в оттенках серого, я был бы очень признателен
Комментарии:
1. Существует разница между DTFT и DFT. Вы вычисляете DFT. И БПФ также вычисляет ДПФ. Вы используете два разных алгоритма для вычисления одного и того же. DTFT использует бесконечный дискретный входной сигнал и выдает непрерывный выходной сигнал. Очевидно, что нет алгоритма, позволяющего вычислить это по данным…
2. 2D DFT вычисляется путем применения 1D DFT к каждой строке матрицы, а затем к каждому столбцу результата.