Преобразование Фурье

Больше
1 год 2 мес. назад - 1 год 2 мес. назад #194 от roman
roman создал тему: Преобразование Фурье
Информация о преобразовании Фурье - см. здесь .

Решил попробовать разложить сигнал на гармонические составляющие с помощью встроенного языка Pine в TradingView:

Re_hl=0.0
Im_hl=0.0
Price=hl2-ema(hl2,120)
j=1 //номер гармоники
ff_T=120 //Период расчета
for i = 0 to (ff_T-1)
    Re_hl := Re_hl+Price*cos(2*3.14159*i*j/ff_T)
    Im_hl := Im_hl-Price*sin(2*3.14159*i*j/ff_T)
Am_hl=2*sqrt(Re_hl*Re_hl+Im_hl*Im_hl)/ff_T
Ph_hl=atan(Im_hl/Re_hl)


В результате возникли проблемы:
1. Функция atan определяет величину в радианах в диапазоне -Pi/2 до Pi/2. Т.е. получается разрыв угла, что вызывает проблемы в расчете sin, т.к. также возникают разрывы.
2. Какой брать Период расчета - это скорее всего вопрос без ответа.
Последнее редактирование: 1 год 2 мес. назад пользователем roman.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
7 мес. 3 дн. назад #218 от roman
roman ответил в теме Преобразование Фурье
Пример разложения динамики изменения цены через дискретное преобразование Фурье представлено на сайте tradingview:
https://www.tradingview.com/script/UTPOoabQ-Low-Frequency-Fourier-Transform/

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
3 нед. 2 дн. назад #229 от roman
roman ответил в теме Преобразование Фурье

//@version=4
study("Low Frequency Fourier Transform", overlay = false, shorttitle="LFFT")
 
//This Study uses the Real Discrete Fourier Transform algorithm to generate 3 sinusoids possibly indicative of future price. 
//I got information about this RDFT algorithm from "http://www.dspguide.com/ch8/5.htm" and "http://www.dspguide.com/ch8/6.htm".
 
//Declaration of const
pi = acos(-1)
 
//Declaration of user-defined variables
N = input(defval=64, title="Sample Time Window", type=input.integer, minval=2, maxval=600, confirm=false, step=1, options=[2,4,8,16,32,64,128,256,512,1024,2048,4096])
 
//Real part of the Frequency Domain Representation
ReX(k) =>
    sum = 0.0
    for i=0 to N-1
        sum := sum + close[i]*cos(2*pi*k*i/N)
    return = sum
 
//Imaginary part of the Frequency Domain Representation
ImX(k) =>
    sum = 0.0
    for i=0 to N-1
        sum := sum + close[i]*sin(2*pi*k*i/N)
    return = -sum
 
//Get sinusoidal amplitude from frequency domain  
ReX_(k) =>
    case = 0.0
    if(k!=0 and k!=N/2)
        case := 2*ReX(k)/N
    if(k==0)
        case := ReX(k)/N
    if(k==N/2)
        case := ReX(k)/N
    return = case
 
 //Get sinusoidal amplitude from frequency domain  
ImX_(k) =>
    return = -2*ImX(k)/N
 
//Get full Fourier Transform
x(i, N) =>
    sum1 = 0.0
    sum2 = 0.0
    for k=0 to N/2
        sum1 := sum1 + ReX_(k)*cos(2*pi*k*i/N)
    for k=0 to N/2
        sum2 := sum2 + ImX_(k)*sin(2*pi*k*i/N)
    return = sum1+sum2
 
//Get single constituent sinusoid
sx(i, k) =>
    sum1 = ReX_(k)*cos(2*pi*k*i/N)
    sum2 = ImX_(k)*sin(2*pi*k*i/N)
    return = sum1+sum2
 
//Plot 3 Low-Freq Sinusoids
plot(sx(0,1), color=#00ff00)
plot(sx(0,2), color=#0000ff)
plot(sx(0,3), color=#ff0000)
 

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Время создания страницы: 0.085 секунд