#python #numpy #scipy #fft
Вопрос:
Теоретически использование преобразования Фурье с дельта-функцией Дирака позволяет получать экспоненциальные функции во временной области, если дельта-функции Дирака находятся в частотной области. Я попытался реализовать эту идею для следующего кода в попытке использовать звуковые волны для кодирования информации, хранящейся в частотной области.
Я работал над проектом по отправке данных с помощью звуковых волн. Я сделал это, кодируя данные в импульсах в частотной области, а затем создавая уникальную звуковую волну, содержащую эту информацию. Я использовал python для построения этого, что дало мне:
import scipy as sp
import math
import numpy as np
from scipy import signal
from scipy import fft
import matplotlib.pyplot as plt
paynowString = "00020101021126380009SG.PAYNOW010100211 658128992803010520400005303702545800.005802SG59006009Singapore620401006304"
characters = []
def split(word):
return [char for char in word]
characters = split(paynowString)
print(characters)
ascii_characters = [ord(char) for char in characters]
print(ascii_characters)
positive_x_domain = np.zeros(9*len(ascii_characters))
rhs = []
xr = list(positive_x_domain)
for i in range(len(ascii_characters)):
rhs = rhs xr[i*9:(i*9 9)] [ascii_characters[i]]
positive_x_domain = rhs xr[(i 9)*9:]
positive_x_domain = np.asarray(positive_x_domain)
print(positive_x_domain)
negative_x_domain = np.flip(positive_x_domain)
print(negative_x_domain)
origin = np.array([0])
x_domain = np.concatenate((negative_x_domain, origin), axis = None)
x_domain = np.concatenate((x_domain, positive_x_domain), axis = None)
print(x_domain)
plt.plot(np.arange((-(len(x_domain)-1)/2), ((len(x_domain)-1)/2) 1), x_domain)
plt.margins(0.1, 0.1)
plt.xlabel('Time [samples]')
plt.ylabel('Amplitude')
plt.grid(True)
plt.show()
После чего это дает мне график, представляющий частотную область:
После этого я затем применяю преобразование Фурье на частотном графике, чтобы получить:
sound_wave = fft.ifft(x_domain)
plt.plot((-(len(x_domain)-1)/2), (((len(x_domain)-1)/2) 1), sound_wave)
plt.margins(0.1, 0.1)
plt.xlabel('Time [samples]')
plt.ylabel('Amplitude')
plt.axis([-0.1, 2500, -0.1, 1])
plt.grid(True)
plt.show()
#end of sending the sound wave
Это дает мне еще один график, который представляет звуковую волну:
В этой попытке я попытался выполнить это, сделав точки отсчета в частотной области для представления дельта-функции Дирака, но это не дает мне периодической звуковой волны в результате из-за проблемы не получения полностью экспоненциальной функции во временной области. Есть ли какой-либо способ изменить свое представление в частотной области, чтобы правильно эмулировать дельта-функцию Дирака таким образом, чтобы результат во временной области был периодическим? Или есть лучшая альтернатива, которая позволяет мне создавать периодическую звуковую волну во временной области без использования дельта-функции Дирака?
Комментарии:
1. Ваши исходные данные не являются периодическими в том смысле, что последовательность строк не является периодической. Если вы поставите
paynowString = "000000002222222200000000222222220000000022222220000000022222222000000002222222200000000"
, вы заметите, что результирующий график является периодическим и отражается вокруг его центра.2. Обратите внимание, что источник, насколько это касается БПФ, является первым образцом, а не тем, который находится посередине (как для частотной, так и для временной области). Применитесь
ifftshift
, чтобы переместить начало координат из середины в первый образец иfftshift
переместить его обратно в середину:sound_wave = fft.fftshift(fft.ifft(fft.ifftshift(x_domain)))
3. @Крис Луэнго Большое вам спасибо за комментарий, это действительно помогло. Не могли бы вы объяснить, пожалуйста, что делают ifftshift и fftshift, чтобы сделать звуковую волну периодической?