คำนวณการแปลงฟูริเยร์แบบไม่ต่อเนื่อง


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]

ช่วยด้วย

ก่อนหน้านี้มีความท้าทายในการค้นหา DFT โดยใช้อัลกอริทึม FFT สำหรับลำดับที่มีความยาวเท่ากับกำลัง 2 คุณอาจพบว่ามีเทคนิคบางอย่างที่อาจช่วยคุณได้ที่นี่ โปรดทราบว่าการท้าทายนี้ไม่ได้จำกัดความซับซ้อนของคุณและยังต้องใช้วิธีแก้ปัญหาของคุณในการเรียงลำดับความยาว

คำตอบ:


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

Python 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 Ideone

รหัสใช้สูตรเทียบเท่า

สูตร


ว้าวร่างที่น่ากลัว มันดีที่ได้เห็นสูตรที่เทียบเท่าซึ่งสามารถอนุญาตให้ใช้รหัสที่สั้นกว่าได้
ไมล์

4

J, 30 20 ไบต์

3 ไบต์ขอบคุณ@miles @miles

ใช้ความจริงที่ว่า 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] 

สิ่งนี้ใช้สูตรในคำตอบของ Leaky Nunโดยอิงจากข้อเท็จจริงที่ exp ( i =) = −1 และตัวดำเนินการพลังงานของ MATL ที่มีเลขชี้กำลังเลขจำนวนเต็มไม่ใช่ (ในภาษาการเขียนโปรแกรมส่วนใหญ่) เป็นผลลัพธ์ของสาขาหลัก

ลองออนไลน์!

เนื่องจากระยะห่างของอ็อกเทฟมีจำนวนเชิงซ้อนด้วยจำนวนเชิงซ้อนชิ้นส่วนจริงและจินตภาพจึงถูกคั่นด้วยช่องว่างเช่นเดียวกับรายการที่แตกต่างกันของเวกเตอร์ที่ได้ ถ้ามันดูน่าเกลียดเกินไปให้เพิ่ม!ที่ส่วนท้าย ( 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

Pyth, 30

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

ชุดทดสอบ

วิธีการที่ไร้เดียงสามากเพียงการนำสูตรไปใช้ พบปัญหาจุดลอยตัวเล็ก ๆ น้อย ๆ ที่มีค่าซึ่งควรเป็นค่าผกผันเพิ่มเติมที่เพิ่มเข้ามาเพื่อให้ได้ผลลัพธ์ที่มีค่าไม่เป็นศูนย์เล็กน้อย

แปลก.jดูเหมือนจะไม่ทำงานกับการขัดแย้งไม่มี แต่ผมไม่แน่ใจว่าถ้าฉันใช้มันอย่างถูกต้อง


1
ขอแสดงความยินดีกับ 10k !!
Luis Mendo เมื่อ



2

Python 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))ของ

นิพจน์reduce(lambda a,b:a*p+b,l)ประเมินพหุนามที่กำหนดโดยlบนค่าpด้วยวิธีของ Horner:

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

Python 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))]

ไอเดียมัน!


โพสต์ว่าเป็นคำตอบที่แยกต่างหาก!
Leun Nun

เอาล่ะถ้าคุณพูดอย่างนั้น
Dennis

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.