Я пытаюсь получить fft и dtft изображения в сером масштабе от первых участников(поэтому без использования встроенных функций fft или dtft) с помощью python

#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 к каждой строке матрицы, а затем к каждому столбцу результата.