Доминантные 3 частоты в ДПФ и Энергия 3 доминантных частот из списка - PullRequest
0 голосов
/ 06 октября 2018
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 частоты в DFT и Энергия 3 доминирующих частот , например, 1-D list?

Дополнительно:

Есть ли в любом случае DFT и IDFT из списка 2-D или 3-D и соответствующие Доминантные 3 частоты в DFT и Энергия 3 доминирующих частот ?

1 Ответ

0 голосов
/ 06 октября 2018

Легко совершать ошибки при работе с дискретными преобразованиями, поскольку существует множество вариантов реализации, которые могут оказывать непосредственное влияние на математику результатов.Поскольку ваши данные состоят из всех действительных чисел, чисел без мнимого компонента, функции 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 волновых чисел / частот

Я собираюсь использовать 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. Чтобы преобразовать волновые числа в частоты, вам необходимо знать частоту дискретизации данных.

ОБНОВЛЕНИЕ

Нахождение доминантных 3 волн в Python

# 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...