【问题标题】:Frequency Domain of a Periodic Fourier Transform Signal周期性傅里叶变换信号的频域
【发布时间】:2021-10-07 00:49:03
【问题描述】:

我一直在做一个通过声波发送数据的项目。 我执行此操作的方法是将数据编码为频域中的脉冲,然后创建包含该信息的独特声波。我用 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

这给了我另一个代表声波的图表:

但是,我试图获得周期性声波,但无法从该图中获得。根据我的理解,如果正负频率在y轴上反射,即频域正负x轴的脉冲幅度相同,那么经过傅里叶变换后产生的声波将是周期性的。

是我的理解有问题,还是我的代码有问题? 如果是这样,我如何确保我的傅里叶逆变换产生的声波是周期性的,以及可播放的? 谢谢!

【问题讨论】:

    标签: python audio signal-processing fft


    【解决方案1】:

    我希望你知道,FFT(Fast Fourier Transform) 和 FT(Fourier Transform) 在算法上有一些不同的东西。也就是说,FFT 没有像 FT 那样扩展算法。您可以在链接中查看详细信息: https://en.wikipedia.org/wiki/Fourier_transform

    也许我应该逐个解释。 您的声音(模拟数据)来自麦克风(转换为数字数据)。 然后,您想要获得 FFT 和 IFT 以消除噪声。但是你应该这样做,你应该对数据应用低、高、低-高或其他过滤器。

    如果您获取对称模拟数据并对数据应用过滤器,它们应该是相同的。

    【讨论】:

    • 我明白了!在这种情况下,我如何确保 IFFT 产生的声波是周期性的?其目的是将数据从频率转换为声波后,声波将数据从发送设备传送到接收设备。如果声波是周期性的,则接收设备能够将信息从声波转换回频域并提取在那里编码的数据。如果声波是周期性的,那么无论从哪里记录声波,接收设备仍然可以解码相同的频率。
    • 我认为有两种方法可以做到这一点。 1-) 你应该确保你产生的数据是周期性的。 2-) 对数据应用 FFT 后,您应该观察到来自频率/幅度流量的数字是相等的。如果没有,您应该应用低通、高通滤波器来去除矛盾的数据。因此,您可以获得干净(频繁)的数据。您可以查看以下链接:realpython.com/python-scipy-fft/#filtering-the-signal
    • 抱歉,我想我对这个问题的解释可能不太清楚。我正在尝试从数据中获取声波,但我需要确保我的声波是周期性的。如何调整我的数据以确保这一点?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    • 2016-04-29
    • 2021-09-28
    • 2011-08-02
    相关资源
    最近更新 更多