代码之家  ›  专栏  ›  技术社区  ›  Md. Rezwanul Haque

DFT中的3个主频和列表中3个主频的能量

  •  0
  • Md. Rezwanul Haque  · 技术社区  · 7 年前
    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))
    

    以上代码是 dft numpy .

    如何找到 3个主频的能量 诸如此类 1-D list ?

    还有吗 DFT IDFT 2-D 3-D 清单及对应 DFT中的3个主频 3个主频的能量 ?

    1 回复  |  直到 7 年前
        1
  •  1
  •   SargeATM    7 年前

    在处理离散变换时很容易出错,因为有许多不同的实现方式,它们会对结果的数学性质产生直接影响。由于您的数据包含所有实数,没有虚部的数字,因此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)
    

    $ 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。要把波数转换成频率,你需要知道数据的采样率。

    更新

    # 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)