我正在测试我关于离散傅里叶变换的知识。
我现在测试的是如何用DFT计算波的中心频率。
为此,我使用以下代码创建一个正弦数据:
// create a 100 Hz wave with a sampling rate of 512 samples per second
var data : [Double] = []
for i in 0...511 {
let t = Double(i) * 100/256
let f = 10 * sin(2 * Double.pi * t)
data.append(f)
}然后我在data上做了一个离散小波变换,得到了两个向量,一个包含实部,一个包含虚部。
据我所知,每个向量的内部都会有:
为了看我是否正确,我检查了256个垃圾箱,并寻找最高的震级。在下面的公式中,幅度最大的是K,我可以找到信号频率:
freq = (K + 1) * fps / NK+1,因为我的第一个索引是0,我已经从数组中丢弃了DC,其中N是样本数。
最大的问题是:我如何计算每个垃圾箱的能量?
E[i] = sqrt(realPart[i] * realPart[i] + imaginaryPart[i] * imaginaryPart[i])?
发布于 2019-03-30 12:09:33
你上面的轮廓看上去就像.计算给定垃圾箱的震级
mag = 2.0 * math.Sqrt(real*real+imag*imag) / number_of_samples其中number_of_samples是输入fft调用的数组的长度.做fft的好处在于,你可以在这组( freq,幅值,相移)上应用逆傅里叶变换来返回你的源时域信号.这样做是一个很好的方法来验证你的过程是正确的
傅里叶变换的幻象与逆傅里叶变换--以为例
你从一个浮点数组开始,它代表像音频、股票市场指数或任何时间序列之类的东西.这是时间域表示,因为它是曲线上的一组点,时间是从左到右的X轴,上下Y轴是曲线的高度。然后将这个数组输入一个fft api调用,该调用将返回其频域表示中的相同信息.同样的信息只是在不同的表象中..。在freq域中,将有一个数组,其中元素0的频率始终为每秒0周期(DC偏移),然后当您在数组中迭代时,使用公式增加freq。
incr_freq := sample_rate / number_of_samples因此,在fft调用生成的复数组中,每个元素都是给定频率的数据,其中每个元素只是一个复数.简单地说,这个freq域表示只是一组频率,每个频率由一个复数(A + Bi)组成,可以用来计算freq的幅值和相移。
有趣的是..。如果您将这个freq域数组发送到逆傅里叶变换中,您将获得原始数据,即时域表示。
myAudio_TD (时域)-发送到fft --> myAudio_FD ( freq域)
然后,您可以自由地进行反向操作,如
myAudio_FD ( freq域)->发送到逆fft --> myAudio_TD (时域)
注意,在这个过程中,您从一个数组myAudio_TD开始,该数组被发送到fft调用中,然后转到逆fft调用中,该调用神奇地返回给您原来的myAudio_TD。
要查看从fft调用返回的复杂数组的完整解析(包括Nyquist限制的概念),请参阅Get frequency with highest amplitude from FFT
https://stackoverflow.com/questions/55430065
复制相似问题