Код: Выделить всё
import numpy as np
import cmath
import matplotlib.pyplot as plt
D=1000
j = complex(0, 1)
pi = np.pi
N = 2 * D + 1
a=np.zeros(2*D+1)
for i in range(-99,100):
a[i+D] = 1
threshold = 1e-10
def clean_complex_array(arr, tol=threshold):
real = np.real(arr)
imag = np.imag(arr)
# Snap near-zero components
real[np.abs(real) < tol] = 0
imag[np.abs(imag) < tol] = 0
# Snap components whose fractional part is close to 0 or 1
real_frac = real - np.round(real)
imag_frac = imag - np.round(imag)
real[np.abs(real_frac) < tol] = np.round(real[np.abs(real_frac) < tol])
imag[np.abs(imag_frac) < tol] = np.round(imag[np.abs(imag_frac) < tol])
return real + 1j * imag
def fourier_series_transform(data, pos_range, inverse=False):
full_range = 2 * pos_range + 1
# Allocate result array
result = np.zeros(full_range, dtype=complex)
if inverse:
# Inverse transform: reconstruct time-domain signal from bk
for n in range(-pos_range, pos_range+ 1):
for k in range(-pos_range, pos_range+ 1):
result[n + pos_range] += data[k + pos_range] * cmath.exp(j * 2 * pi * k * n / full_range)
else:
# Forward transform: compute bk from b[n]
for k in range(-pos_range, pos_range+ 1):
for n in range(-pos_range, pos_range+ 1):
result[k + pos_range] += (1 / full_range) * data[n + pos_range] * cmath.exp(-j * 2 * pi * k * n / full_range)
return result
ak = fourier_series_transform(a, D)
ak = clean_complex_array(ak)
Теперь для части, с которой у меня была проблема: нас попросили создать сигнал freq f_k, такой, что F_K будет A_K с 4 нулями после каждого значения и умножен 0,2*[A_0,0,0,0,0,0, A_1,0,0,0,0,0, A_2,0,0,0,0, A_3, ...], мы хотим показать, что это равносильно литератированию сигнала в домене времен. 10005 Образцов, которые составляют ровно 5*2001, что было исходным количеством образцов сигналов), ниже приведен код для этого раздела, чтобы установить f_k и f [n]: < /p>
Код: Выделить всё
stretch_factor = 5
f_k = np.zeros(stretch_factor * N, dtype=complex)
f_k[::stretch_factor] = 0.2 * ak # scale to keep energy in check
# New domain size after stretching
D_new = (len(f_k) - 1) // 2
# Inverse transform to get f[n]
f_n = fourier_series_transform(f_k, D_new, inverse=True)
f_n = clean_complex_array(f_n)
plt.figure()
plt.plot(np.arange(-D_new, D_new + 1), np.real(f_n), label='Real part')
plt.plot(np.arange(-D_new, D_new + 1), np.imag(f_n), label='Imaginary part', color='red')
plt.grid(True)
plt.title("Compressed signal $f[n]$ after frequency stretching")
plt.xlabel("n")
plt.ylabel("Amplitude")
plt.legend()
, что не так, я должен быть полностью Другое, что -то вроде этого:
Я не знаю, почему это так, и я даже пытался использовать, почему это так, и как это так, и как это так, и как это так и не могу, и как это не так, как это не так, и как это так и не могу.>
Подробнее здесь: https://stackoverflow.com/questions/797 ... -fourier-s