首页 > 解决方案 > 傅里叶变换 (FFT) 的 3 个正弦曲线图

问题描述

这是我尝试从“http://www.dspguide.com/ch8/5.htm”和“http://www.dspguide.com/ch8/”中实现的(Python中该代码的端口)RDFT算法6.htm"

安装和导入库:

!pip install yfinance

import pandas as pd
import yfinance as yf
import numpy as np 
import matplotlib.pyplot as plt
import math

填充来自 Yahoo Finance 的数据框:

    btc_df = yf.download('BTC-USD', 
                  start='2021-01-01', 
                  end='2021-08-24', 
                  progress=False)

#round the Close price to 2 decimals

btc_df['Close'].round(decimals=2)

定义采样变量N(整数:2,4,8,16,32,64,128,256,512,1024,2048)

N = 4

定义常量:

Pi = pi = math.acos(-1)

定义变量“关闭”。它持有来自雅虎数据框的收盘价

Close = btc_df['Close']

计算正弦函数:(这让我遇到了麻烦,下面的 6 个函数将结果从一个传播到另一个,最终的 Sx(0,2) 应该包含绘图函数的适当数据)

#Real part of the Frequency Domain Representation
def ReX(k):
  sum_a = 0.0
  for i in range(0, N-1):
    sum_a += sum_a + Close[i]*math.cos(2*pi*k*i/N)
return sum_a

#Imaginary part of the Frequency Domain Representation
def ImX(k):
  sum_b = 0.0
  #for i=0 to N-1
  for i in range(0, N-1):
    sum_b += sum_b + Close[i]*math.sin(2*pi*k*i/N)
return -sum_b

#Get sinusoidal amplitude from frequency domain  
def ReX_(k):
  case = 0
  if k != 0 and k != N / 2:
    case = 2 * ReX(k) / N
  elif k == 0:
    case = ReX(k) / N
  elif k == N / 2:
    case = ReX(k) / N
  return case

#Get sinusoidal amplitude from frequency domain  
def ImX_(k):
  return -2*ImX(k)/N

#Get full Fourier Transform
def x(i, N):
  sum1 = 0.0
  sum2 = 0.0
  for k in range (0, (N/2)):
    sum1 += ReX_(k)*math.cos(2*pi*k*i/N)
    sum2 += ImX_(k)*math.sin(2*pi*k*i/N)
  return sum1+sum2

#Get single constituent sinusoid
def Sx(i,k):
  sum1 = 0.0
  sum2 = 0.0
  sum1 += ReX_(k)*math.cos(2*pi*k*i/N)
  sum2 += ImX_(k)*math.sin(2*pi*k*i/N)
  return sum1+sum2

我们需要绘制 Sx(i,k) "Sx(0,2)" 的最后一个函数应该计算正确。问题是将它正确地传递给 ['Close'] 的数据帧 btc_df 中的每一行我这样做的方式是这样的:

btc_df['Sx'] = btc_df.apply(lambda x: Sx(x[0],x[2]), axis=1)

在这里,我们应该绘制一条带有“峰”和“谷”的平滑曲线,但我们得到了一个非常讨厌的“ZIGzag”曲线......

plt.figure(figsize=(15,5))
btc_df['Sx'].plot(grid=True)
plt.ylabel('Sx Values')
plt.title('BTC Sx on Close')

那么如何才能绘制出 Sx(0,2) 的平滑曲线,我的问题在哪里?我不太可能成为一名程序员,使用我的逻辑和互联网的帮助学习 Python ......

标签: pythonfft

解决方案


推荐阅读