DFT 中的 3 个主要频率和列表中 3 个主要频率的能量
Dominant 3 frequencies in the DFT and Energy of the 3 dominant frequencies from a list
data = [222, 251,212,188 , 244, 202, 198, 244, 175, 216]
import numpy as np
print("Discrete fourier transform")
print(np.fft.fft(data))
print("Inverse discrete fourier transform")
print(np.fft.ifft(data))
以上代码是使用numpy
的dft
代码。
问题是:
如何在 DFT 中找到 3 个主要频率和 3 个主要频率的能量,例如 1-D
list
?
此外:
Is there anyway DFT
and IDFT
from 2-D
or 3-D
list and corresponding Dominant 3 frequencies in the DFT and Energy of the 3 dominant frequencies?
处理离散变换时很容易出错,因为有许多不同的实现方式会直接影响结果的数学运算。由于您的数据由所有实数组成,没有虚部的数字,因此 np.fft.rfft 函数更易于使用。我提供了一些示例 python/bash 代码来展示它的用途以及如何找到您所包含数据的能谱。
计算能量
import numpy as np
data = [222, 251,212,188 , 244, 202, 198, 244, 175, 216]
#print("One-sided discrete fourier transform coefficients")
complex_one_sided_spectrum = np.fft.rfft(data, norm='ortho')
#print(complex_one_sided_spectrum)
#print("Magnitude")
one_sided_spectrum_magnitude = np.abs(complex_one_sided_spectrum)
#print(one_sided_spectrum_magnitude)
#print("Wave Numbers")
wave_numbers = np.arange(len(complex_one_sided_spectrum))
#print(wave_numbers)
#print("Energy Spectrum")
wave_energy = one_sided_spectrum_magnitude * one_sided_spectrum_magnitude
#print(wave_energy)
#output table to command line
print("\t".join(['wave numbers', 'energy spectrum', 'dft magnitude', 'dft coefficient']))
for i in range(0,len(complex_one_sided_spectrum)):
row = [str(wave_numbers[i]),
str(wave_energy[i]),
str(one_sided_spectrum_magnitude[i]),
str(complex_one_sided_spectrum[i])]
print("\t".join(row))
输出
wave number energy spectrum dft magnitude dft coefficient
0 463110.4000000001 680.5221524682353 (680.5221524682353+0j)
1 156.53675171891524 12.511464811080884 (8.323007319698682-9.341536323065784j)
2 374.41182935941566 19.349724270888608 (13.380080448562616-13.978028349857077j)
3 1014.9632482810841 31.85848785302096 (15.39407513156416-27.892395005177345j)
4 1240.8881706405841 35.22624264153905 (-18.43972470483202+30.01440859738189j)
5 250.0 15.811388300841896 (-15.811388300841896+0j)
寻找主导波 3 Numbers/Frequencies
我将在这里使用 bash(因为我只想这样做),但它很容易翻译成 python 代码。
$ python 52675886.py | sort --key=2 --reverse | column -t -s $'\t' | head -n 4
wave number energy spectrum dft magnitude dft coefficient
0 463110.4000000001 680.5221524682353 (680.5221524682353+0j)
2 374.41182935941566 19.349724270888608 (13.380080448562616-13.978028349857077j)
5 250.0 15.811388300841896 (-15.811388300841896+0j)
所以占主导地位的三个波是0、2、5。要将波数转换为频率,您需要知道数据的采样率。
更新
找到 Python
中的主导 3 波
# convert attribute arrays into a list of wave dictionaries
waves = []
for i in wave_numbers:
wave = {'wave_number': wave_numbers[i],
'wave_energy': wave_energy[i],
'one_sided_spectrum_magnitude': one_sided_spectrum_magnitude[i],
'complex_one_sided_spectrum': complex_one_sided_spectrum[i]}
waves.append(wave)
#print(waves)
# tell sorted that we want to compare the wave_energy
def wave_energy_comparison_key(wave):
return wave['wave_energy']
sorted_waves = sorted(waves, key=wave_energy_comparison_key, reverse=True)
#print(sorted_waves)
top_3_waves = [sorted_waves[i] for i in range(0,3)]
print(top_3_waves)
data = [222, 251,212,188 , 244, 202, 198, 244, 175, 216]
import numpy as np
print("Discrete fourier transform")
print(np.fft.fft(data))
print("Inverse discrete fourier transform")
print(np.fft.ifft(data))
以上代码是使用numpy
的dft
代码。
问题是:
如何在 DFT 中找到 3 个主要频率和 3 个主要频率的能量,例如 1-D
list
?
此外:
Is there anyway
DFT
andIDFT
from2-D
or3-D
list and corresponding Dominant 3 frequencies in the DFT and Energy of the 3 dominant frequencies?
处理离散变换时很容易出错,因为有许多不同的实现方式会直接影响结果的数学运算。由于您的数据由所有实数组成,没有虚部的数字,因此 np.fft.rfft 函数更易于使用。我提供了一些示例 python/bash 代码来展示它的用途以及如何找到您所包含数据的能谱。
计算能量
import numpy as np
data = [222, 251,212,188 , 244, 202, 198, 244, 175, 216]
#print("One-sided discrete fourier transform coefficients")
complex_one_sided_spectrum = np.fft.rfft(data, norm='ortho')
#print(complex_one_sided_spectrum)
#print("Magnitude")
one_sided_spectrum_magnitude = np.abs(complex_one_sided_spectrum)
#print(one_sided_spectrum_magnitude)
#print("Wave Numbers")
wave_numbers = np.arange(len(complex_one_sided_spectrum))
#print(wave_numbers)
#print("Energy Spectrum")
wave_energy = one_sided_spectrum_magnitude * one_sided_spectrum_magnitude
#print(wave_energy)
#output table to command line
print("\t".join(['wave numbers', 'energy spectrum', 'dft magnitude', 'dft coefficient']))
for i in range(0,len(complex_one_sided_spectrum)):
row = [str(wave_numbers[i]),
str(wave_energy[i]),
str(one_sided_spectrum_magnitude[i]),
str(complex_one_sided_spectrum[i])]
print("\t".join(row))
输出
wave number energy spectrum dft magnitude dft coefficient
0 463110.4000000001 680.5221524682353 (680.5221524682353+0j)
1 156.53675171891524 12.511464811080884 (8.323007319698682-9.341536323065784j)
2 374.41182935941566 19.349724270888608 (13.380080448562616-13.978028349857077j)
3 1014.9632482810841 31.85848785302096 (15.39407513156416-27.892395005177345j)
4 1240.8881706405841 35.22624264153905 (-18.43972470483202+30.01440859738189j)
5 250.0 15.811388300841896 (-15.811388300841896+0j)
寻找主导波 3 Numbers/Frequencies
我将在这里使用 bash(因为我只想这样做),但它很容易翻译成 python 代码。
$ python 52675886.py | sort --key=2 --reverse | column -t -s $'\t' | head -n 4
wave number energy spectrum dft magnitude dft coefficient
0 463110.4000000001 680.5221524682353 (680.5221524682353+0j)
2 374.41182935941566 19.349724270888608 (13.380080448562616-13.978028349857077j)
5 250.0 15.811388300841896 (-15.811388300841896+0j)
所以占主导地位的三个波是0、2、5。要将波数转换为频率,您需要知道数据的采样率。
更新
找到 Python
中的主导 3 波# convert attribute arrays into a list of wave dictionaries
waves = []
for i in wave_numbers:
wave = {'wave_number': wave_numbers[i],
'wave_energy': wave_energy[i],
'one_sided_spectrum_magnitude': one_sided_spectrum_magnitude[i],
'complex_one_sided_spectrum': complex_one_sided_spectrum[i]}
waves.append(wave)
#print(waves)
# tell sorted that we want to compare the wave_energy
def wave_energy_comparison_key(wave):
return wave['wave_energy']
sorted_waves = sorted(waves, key=wave_energy_comparison_key, reverse=True)
#print(sorted_waves)
top_3_waves = [sorted_waves[i] for i in range(0,3)]
print(top_3_waves)