이산 푸리에 변환 계산


9

길이에 관계없이 이산 푸리에 변환 (DFT)을 구현하십시오. 이것은 함수 또는 프로그램으로 구현 될 수 있으며 시퀀스는 인수 또는 표준 입력을 사용하여 제공 될 수 있습니다.

알고리즘은 순방향의 표준 DFT를 기반으로 결과를 계산합니다. 입력 시퀀스는 길이를 N가지며로 구성됩니다 [x(0), x(1), ..., x(N-1)]. 출력 순서는 길이가 같 [X(0), X(1), ..., X(N-1)]으며 각각 X(k)아래의 관계에 의해 정의되는 위치 로 구성 됩니다.

DFT

규칙

  • 이것은 가장 짧은 솔루션이 승리합니다.
  • DFT를 정방향 또는 역방향 (역이라고도 함)으로 계산하는 내장은 허용되지 않습니다.
  • 부동 소수점 부정확성은 계산되지 않습니다.

테스트 사례

DFT([1, 1, 1, 1]) = [4, 0, 0, 0]
DFT([1, 0, 2, 0, 3, 0, 4, 0]) = [10, -2+2j, -2, -2-2j, 10, -2+2j, -2, -2-2j]
DFT([1, 2, 3, 4, 5]) = [15, -2.5+3.44j, -2.5+0.81j, -2.5-0.81j, -2.5-3.44j]
DFT([5-3.28571j, -0.816474-0.837162j, 0.523306-0.303902j, 0.806172-3.69346j, -4.41953+2.59494j, -0.360252+2.59411j, 1.26678+2.93119j] = [2, -3j, 5, -7j, 11, -13j, 17]

도움

이전 에는 2의 거듭 제곱과 같은 길이의 시퀀스에 대해 FFT 알고리즘을 사용하여 DFT를 찾는 데 어려움 이있었습니다 . 여기서 도움이 될만한 몇 가지 트릭을 찾을 수 있습니다. 이 과제로 인해 복잡성이 제한되는 것은 아니며 솔루션이 길이에 관계없이 작동해야합니다.

답변:


2

젤리 , 16 15 바이트

LR’µ×'÷L-*²³÷S€

온라인으로 사용해보십시오!

작동 원리

LR’µ×'÷L-*²³÷S€  Main link. Argument [x(0), ..., x(N-1)].

L                Length; yield N.
 R               Range; yield [1, ..., N].
  ’              Decrement; yield [0, ..., N-1].
   µ             Begin a new, monadic chain. Argument: [0, ..., N-1]
    ×'           Spawned multiply [0, ..., N-1] with itself, yielding the matrix
                 of all possible products k×n.
      ÷L         Divide each product by N.
        -*       Compute (-1)**(kn÷L) for each kn.
          ²      Square each result, computing (-1)**(2kn÷L).
           ³÷    Divide [x(0), ..., x(N-1)] by the results.
             S€  Compute the sum for each row, i.e., each X(k).


5

파이썬 3, 77 바이트

lambda x,e=enumerate:[sum(t/1j**(4*k*n/len(x))for n,t in e(x))for k,_ in e(x)]

Ideone에서 테스트하십시오 .

코드는 동등한 공식을 사용합니다

공식


와우, 거대한 인물. 더 짧은 코드를 허용하는 동등한 수식을 보는 것이 좋습니다.
마일

4

J, 30 20 바이트

@miles 덕분에 3 바이트 .

사실을 사용합니다 e^ipi = -1.

수식이됩니다 X_k = sum(x_n / ((-1)^(2nk/N))).

+/@:%_1^2**/~@i.@#%#

용법

>> DCT =: +/@:%_1^2**/~@i.@#%#
>> DCT 1 2 3 4 5
<< 15 _2.5j3.44095 _2.5j0.812299 _2.5j_0.812299 _2.5j_3.44095

여기서 >>STDIN <<은 STDOUT입니다.

"부동 소수점 부정확도는 계산되지 않습니다."


3

MATL , 20 16 바이트

-1yn:qt!Gn/E*^/s

입력은 열 벡터입니다. 즉 쉼표를 세미콜론으로 바꿉니다.

[1; 1; 1; 1]
[1; 0; 2; 0; 3; 0; 4; 0]
[1; 2; 3; 4; 5]
[5-3.28571j; -0.816474-0.837162j; 0.523306-0.303902j; 0.806172-3.69346j; -4.41953+2.59494j; -0.360252+2.59411j; 1.26678+2.93119j] 

이것은 exp ( ) = -1이며 정수가 아닌 지수를 갖는 MATL의 거듭 제곱이 (대부분의 프로그래밍 언어에서와 같이) 주요 분기 결과를 생성 한다는 사실을 기반으로 Leaky Nun의 답변에 수식을 사용합니다 .

온라인으로 사용해보십시오!

복소수의 옥타브의 이상한 간격으로 인해 실수 부분과 허수 부분은 결과 벡터의 다른 항목처럼 공백으로 구분됩니다. 너무 못 생겼다면 !끝에 ( 17 바이트 )를 추가 하여 출력의 각 항목을 다른 행에 두십시오.

설명

-1      % Push -1
y       % Get input implicitly. Push a copy below and one on top of -1
n:q     % Row vector [0 1 ... N-1] where N is implicit input length
t!      % Duplicate and transpose: column vector
Gn      % Push input length
/       % Divide
E       % Multiply by 2
*       % Multiply, element-wise with broadcast. Gives the exponent as a matrix
^       % Power (base is -1), element-wise. Gives a matrix
/       % Divide matrix by input (column vector), element-wise with broadcast
s       % Sum

2

피스, 30

ms.e*b^.n1****c_2lQk.n0d.j0)QU

테스트 스위트

매우 순진한 접근 방식, 수식 구현. 부가적인 역수 여야하는 값과 함께 약간의 부동 소수점 문제가 발생하여 0에서 약간 벗어난 값이됩니다.

이상하게도 .j인수없이 작동하지 않는 것 같지만 올바르게 사용하고 있는지 확실하지 않습니다.


1
10k 축하합니다 !!
Luis Mendo 2016 년



2

파이썬 2, 78 바이트

l=input();p=1
for _ in l:print reduce(lambda a,b:a*p+b,l)*p;p*=1j**(4./len(l))

다항식은의 각 거듭 제곱 p에 대해 평가됩니다 1j**(4./len(l)).

이 식은 Horner의 방법을 통해 값에 reduce(lambda a,b:a*p+b,l)의해 주어진 다항식을 평가합니다 .lp

reduce(lambda a,b:a*10+b,[1,2,3,4,5])
=> 12345

단, 입력 항 목은 끝이 바뀌어 반전됩니다. 우리는 그것을 뒤집을 수는 있지만 p**len(l)==1푸리에 계수의 p경우 전체 결과 를 반전 하고 곱하는 해킹을 사용할 수 있습니다 p.

동일한 길이의 시도 :

l=input();i=0
for _ in l:print reduce(lambda a,b:(a+b)*1j**i,l,0);i+=4./len(l)

l=input();i=0
for _ in l:print reduce(lambda a,b:a*1j**i+b,l+[0]);i+=4./len(l)

1 바이트 이상을위한 함수 (79) :

lambda l:[reduce(lambda a,b:a*1j**(i*4./len(l))+b,l+[0])for i in range(len(l))]

재귀 시도 (80) :

f=lambda l,i=0:l[i:]and[reduce(lambda a,b:(a+b)*1j**(i*4./len(l)),l,0)]+f(l,i+1)

반복적으로 시뮬레이션 reduce(80) :

l=input();p=1;N=len(l)
exec"s=0\nfor x in l:s=s*p+x\nprint s*p;p*=1j**(4./N);"*N


1

파이썬 2, 89 바이트

사실을 사용합니다 e^ipi = -1.

수식이됩니다 X_k = sum(x_n / ((-1)^(2nk/N))).

lambda a:[sum(a[x]/(-1+0j)**(x*y*2./len(a))for x in range(len(a)))for y in range(len(a))]

무시 했어!


별도의 답변으로 게시하십시오!
Leaky Nun

네가 그렇게 말한다면.
데니스

1

Mathematica, 49 48 47 바이트

Total[I^Array[4(+##-##-1)/n&,{n=Length@#,n}]#]&

@Dennis ' 솔루션 의 공식을 기반으로합니다 .


1

공리, 81 바이트

g(x)==(#x<2=>x;[reduce(+,[x.j/%i^(4*k*(j-1)/#x)for j in 1..#x])for k in 0..#x-1])

누군가가 여기에 게시하는 공식을 사용하여. 결과

(6) -> g([1,1,1,1])
   (6)  [4,0,0,0]
                                    Type: List Expression Complex Integer
(7) -> g([1,2,3,4])
   (7)  [10,- 2 + 2%i,- 2,- 2 - 2%i]
                                    Type: List Expression Complex Integer
(8) -> g([1,0,2,0,3,0,4,0])
   (8)  [10,- 2 + 2%i,- 2,- 2 - 2%i,10,- 2 + 2%i,- 2,- 2 - 2%i]
                                    Type: List Expression Complex Integer
(11) -> g([1,2,3,4,5])
   (11)
        5+--+4       5+--+3    5+--+2      5+--+
        \|%i   + 5%i \|%i   - 4\|%i   - 3%i\|%i  + 2
   [15, --------------------------------------------,
                           5+--+4
                           \|%i
    5+--+4       5+--+3    5+--+2      5+--+
    \|%i   + 3%i \|%i   - 5\|%i   - 2%i\|%i  + 4
    --------------------------------------------,
                       5+--+4
                       \|%i
    5+--+4       5+--+3    5+--+2      5+--+
    \|%i   + 4%i \|%i   - 2\|%i   - 5%i\|%i  + 3
    --------------------------------------------,
                       5+--+4
                       \|%i
    5+--+4       5+--+3    5+--+2      5+--+
    \|%i   + 2%i \|%i   - 3\|%i   - 4%i\|%i  + 5
    --------------------------------------------]
                       5+--+4
                       \|%i
                                    Type: List Expression Complex Integer
(12) -> g([1,2,3,4,5.])
   (12)
   [15.0, - 2.5 + 3.4409548011 779338455 %i, - 2.5 + 0.8122992405 822658154 %i,
    - 2.5 - 0.8122992405 822658154 %i, - 2.5 - 3.4409548011 779338455 %i]
                                      Type: List Expression Complex Float

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.