in,cos/가산정리에 기초한 방법 & IIR 필터의 방법/Python/의미가 없을 때

15123 단어 산술
참고문: 삼상직수, "기지된, 경량의sin/cos계산 알고리즘 제4회의2: 정현파를 고속으로 생성할 수 있는 귀속계산법",, CQ출판, 2017년 10월호, pp.158-159
sin(0 Δθ), sin(1 Δθ), sin(2 Δθ), sin(3 Δθ), ...... 이렇게 순서대로sin을 요구합니다.동시에 코스도 요구한다.
자원이 부족한 마이크로컴퓨터가 양상진동기 등을 구성할 때 사용하는 방법으로, PC로 계산할 의미가 없다.절차의 확인일 뿐입니다.
덧셈의 정리에 근거한 방법
계산 순서는 다음과 같다.
  • 우선 sin(0),cos(0),sin(Δθ),cos(Δθ),sin(0 Δθ) 이 네 개만 합쳐서 무엇으로 미리 계산합니까?
  • 우선 확정해야 할 cos는 이미 계산이 끝났다.sin(1 Δθ)도 마찬가지다.
  • 는 다음cos도 계산했다.sin(2 Δθ)도 마찬가지다.
  • 다음에 요구되는 sin(Δθ + Δθ)sin(Δθ) cos(Δθ) + cos (Δθ) sin(Δθ)이기 때문에 가법정리를 통해 표시할 수 있다cos.각 요소는 모두 계산해 보았고 곱셈과 덧셈만 계산했다.sin(3 Δθ)도 마찬가지다.
  • 다음에 요구되는 sin(2 Δθ + Δθ)sin(2 Δθ) cos(Δθ) + cos (2 Δθ) sin(Δθ)이기 때문에 가법정리를 통해 표시할 수 있다cos.각 요소는 모두 계산해 보았고 곱셈과 덧셈만 계산했다.sin도 마찬가지다.이하 마찬가지로 곱셈, 덧셈cos만 순서대로 구한다sqrt(sin^2 + cos^2).
  • 이 방법은 오차가 포함된 in,cos의 값을 바탕으로 다음 in,cos의 값을 확정하기 때문에 진폭이 점점 멀어진다.이런 상황을 방지하는 수단으로sin,cos의 값을 진폭1으로 나누어 진폭sin을 강제로 사용한다.즉 cos1/(sqrt(sin^2 + cos^2))를 곱해 얻은 것1/sqrt(x)을 곱한 것이다.
    그러나 1의 계산 자체는 시간이 필요하다.그러나 진폭이탈1/sqrt(x)해도 큰 편차가 없을 것으로 보인다.따라서 x=1를 중심으로 테일러가 전개1.5 - 0.5 * x(見る/隠す) ソースコード (.py) と実行結果부터 2항까지 진폭을 교정한다.a = 2 cos(Δθ)
    import math
    import matplotlib.pyplot as plt
    
    def SinCos(Δθ):
        Δθ    = Δθ
        sin0  = math.sin(0)
        cos0  = math.cos(0)
        sinΔθ = math.sin(Δθ)
        cosΔθ = math.cos(Δθ)
        sin   = [None, sin0]
        cos   = [None, cos0]
    
        def sincos():
            sin[0] = sin[1]
            cos[0] = cos[1]
    
            sin[1] = sin[0] * cosΔθ + cos[0] * sinΔθ
            cos[1] = cos[0] * cosΔθ - sin[0] * sinΔθ
    
            adj = 1.5 - 0.5 * (sin[0]**2 + cos[0]**2)
            return sin[0] * adj, cos[0] * adj
    
        return sincos
    
    
    ########
    # test #
    ########
    Δθ      = math.pi/8
    sin_cos = SinCos(Δθ) # 初期値をセットした状態でクロージャを開いて、
    θList   = []
    sinList = []
    cosList = []
    for i in range(50):
        sin, cos = sin_cos() # 外に出した函数を実行し続ける。実行するたびに sin、cos の値が更新される。
    
        θList.append(i * Δθ)
        sinList.append(sin)
        cosList.append(cos)
        #print("θ: %.2f, sin: %.6f, cos: %.6f, amp: %.16f" % (i*Δθ, sin, cos, math.sqrt(sin**2 + cos**2)))
    
    plt.plot(θList,sinList,
             θList,cosList)
    plt.xlabel("radian")
    plt.ylabel("amplitude")
    plt.grid(color="lightblue")
    plt.show()
    
    실행 결과:

    IIR 필터를 사용하는 방법
    다만 기사에 소개된 계산 공식을 파이톤으로 재현했다.무슨 말인지 전혀 모르겠지만 아주 간단합니다.덧셈의 정리에 따른 방법과 달리 진폭은 1에서 벗어나지 않는다고 한다.
    계산 순서는 다음과 같다.
  • c = -cos(Δθ),s = sin(Δθ),u[n] = a * u[n-1] - u[n-2] 이 세 개만 합쳐서 어떤 함수로 미리 계산해야 하는지.

  • 고려n의 점화식.0, 1, 2, ......u[0] = 0.초기값은 u[1] = 1sin입니다.
  • cosu[n]는 각각 sin(n Δθ) = s * u[n]를 통해 이 점화식cos(n Δθ) = u[n+1] + c * u[n]에서 얻었다.n0, 1, 2, .......(見る/隠す) ソースコード (.py) と実行結果
    import math
    import matplotlib.pyplot as plt
    
    def SinCos(Δθ):
        A = 2 * math.cos(Δθ)
        C = -math.cos(Δθ)
        S = math.sin(Δθ)
        u = [0, 1]
        def sincos():
            sin = S * u[0]
            cos = u[1] + C * u[0]
            u[0], u[1] = u[1], A * u[1] - u[0]
            return sin, cos
    
        return sincos
    
    ########
    # test #
    ########
    Δθ      = math.pi/8
    sin_cos = SinCos(Δθ) # 初期値をセットした状態でクロージャを開いて、
    θList   = []
    sinList = []
    cosList = []
    
    for i in range(50):
        sin, cos = sin_cos() # 外に出した函数を実行し続ける。実行するたびに sin、cos の値が更新される。
    
        θList.append(i * Δθ)
        sinList.append(sin)
        cosList.append(cos)
        #print("θ: %.2f, sin: %.6f, cos: %.6f, amp: %.16f" % (i*Δθ, sin, cos, math.sqrt(sin**2 + cos**2)))
    
    
    plt.plot(θList,sinList,
             θList,cosList)
    plt.xlabel("radian")
    plt.ylabel("amplitude")
    plt.grid(color="lightblue")
    plt.show()
    
    실행 결과:

    관련: http://ti-nspire.hatenablog.com/archive/category/sin%E3%80%81cos%20%E3%81%AE%E5%86%8D%E5%B8%B0%E7%9A%84%E8%A8%88%E7%AE%97%E6%B3%95
  • 좋은 웹페이지 즐겨찾기