تقنية

ifft: هل الطيف الحقيقي يعطي خرجًا حقيقيًا؟

العكس الكامل والجزء الحقيقي.
مكونان مختلفان في الحفظ.

تعيد ifft مصفوفة مركبة. [1] نختبر طيفًا كاملًا بقيم حقيقية، ثم نرى أثر حفظ الجزء الحقيقي من عكسه وحده.

سمّ مجال المدخل قبل وصفه بالحقيقي

تقرأ ifft مدخلها في ترتيب معاملات fft، وتعيد خرجًا مركبًا. [1] نقصد بطيف حقيقي هنا أن كل معامل من المعاملات الأربعة له جزء تخيلي صفر؛ لا نقصد أن العكس نفسه حقيقي القيم.

نؤلف A=[3,2,−1,4] من نوع float64 وبشكل (4,) على NumPy 2.3.5. هذه قائمة معاملات تردد كاملة، لا القائمة المختصرة التي تحتاج تفسيرًا خاصًا في irfft. نثبت الطول أربعًا والتطبيع backward.

الفهارس تبدأ من صفر: A[1]=2 وA[3]=4. لخرج زمني حقيقي يكون طيفه متناظرًا هيرميتيًا. [2] لأن هاتين القيمتين حقيقيتان أصلًا، فإن المرافق لا يغيرهما؛ لكنهما غير متساويتين في مثالنا.

لا نحذف معاملًا من الطرف الآخر ولا نبدل مكانه. ونترك الوحدات الفيزيائية ومعدل العينات غير محددين؛ المثال حساب مؤلف عن نوع القيم والمعلومات التي نخسرها عند الحفظ.

احسب الجزأين ثم أعد الطيف الكامل

العكس في اتفاقية backward يستعمل الأس الموجب وعامل 1/N. [2] لجمع أربع نقاط تكون الجذور 1،i،−1،−i، حيث i²=−1.

عند الموضع صفر نحصل على (3+2−1+4)/4=2. عند الموضع 1 يصبح الجمع 3+2i+1−4i=4−2i، والقسمة على أربع تعطي 1−0.5i.

عند الموضع 2 نحسب (3−2−1−4)/4=−1. وعند الموضع 3 نحصل على 1+0.5i. إذن y=[2,1−0.5i,−1,1+0.5i]، لا [2,1,−1,1].

أعاد np.fft.ifft(A,norm="backward") هذه القيم بنوع complex128 وشكل (4,). وفي التنفيذ المقروء للإصدار 2.3.5 يمر ifft بمسار مركب للعكس. [3] لم نجعل كون المدخل float64 شرطًا لخرج float64.

طبقنا np.fft.fft(y,norm="backward") على العكس الكامل. أعاد [3+0i,2+0i,−1+0i,4+0i]. الأجزاء التخيلية في y شاركت في استرجاع اختلاف المعاملين 2 و4؛ ليست أرقامًا نهملها ثم نزعم استعادة الطيف نفسه.

راجع ما يضيع عند حفظ real فقط

كتبنا r=y.real.copy()، فصارت القيم المحفوظة [2,1,−1,1] من نوع float64. هذه نسخة من الأجزاء الحقيقية، وليست نتيجة فحص بأن الجزأين ±0.5 خطأ يجوز إزالتهما.

طبقنا fft بوضع backward على r، فأعاد [3+0i,3+0i,−1+0i,3+0i]. الطيف الجديد يختلف عن A عند الفهرسين 1 و3: زادت 2 إلى 3، ونقصت 4 إلى 3.

نرى السبب مباشرة عند الفهرس 1: تحويل r يعطي 2−i+1+i=3. اختفى الحد الذي حمل الفرق بين 2 و4، لأننا حفظنا r دون الأجزاء التخيلية التي كانت في y.

لهذه الأربع قيم الطيفية الحقيقية، حساب تحويل real(ifft(A)) يعطي [A[0],(A[1]+A[3])/2,A[2],(A[1]+A[3])/2]. متوسط الزوج في مثالنا (2+4)/2=3؛ ليس ذلك استرجاعًا لقيمة كل طرف على حدة.

لم نستعمل real_if_close أو نختبر حد قرب من صفر. ±0.5 ممثلتان بالضبط في التشغيل المختار. القرار هنا حذف صريح لمكون معلوم؛ احفظ المكونات اللازمة إذا كان المطلوب إعادة الطيف الأصلي.

زوج غير متناظر وتحكم متناظر.
متوسط الزوج لا يستعيد طرفيه.

قارن بتحكم متناظر وحدد النطاق

نختار طيفًا ثانيًا B=[3,3,−1,3]. فيه الطرفان 1 و3 متساويان، فالعكس أعاد [2+0i,1+0i,−1+0i,1+0i]. الأجزاء التخيلية صفرية في هذا التحكم المحفوظ.

تحويل العكس الكامل وتحويل أجزائه الحقيقية أعادا B نفسه. لاحظ أن r في المثال الأول يساوي قيم العكس في هذا التحكم: الحذف نقلنا إلى نتيجة توافق الطيف المتناظر B بدل A غير المتناظر.

أضفنا طيفًا صفريًا والتركيبات الستة عشر من {−2,1} في أربع خانات. مع المثال والتحكم المتناظر صار لدينا 19 طيفًا مختلفًا، ولكل منها مصفوفة مدخل مستقلة.

نفذنا 19 استدعاء ifft و38 استدعاء fft: 57 استدعاءً عامًا مسمى، و228 عنصر مخرج مركب. نفذنا أيضًا 19 عملية نسخ للأجزاء الحقيقية، وحفظنا 76 قيمة حقيقية منها خارج عد عناصر مخرجات FFT.

قارنّا القيم بمرجع Fraction مستقل لجذور الأربع والعلاقة الخاصة بمتوسط الزوج، وفحصنا الشكل والنوع وثبات بايتات المدخل والعكس والنسخة الحقيقية. كان الفرق المحفوظ صفرًا ضمن حد مطلق 10⁻¹²، دون ضمان دقة عامة.

تطابق الطيف المستعاد بعد الحذف مع الأصل في عشر حالات، وهي التي تساوى فيها المعاملان 1 و3؛ اختلف في تسع. نقصر ذلك على أطياف حقيقية كاملة بطول أربع والنوع والتطبيع المحددين. لم نفحص أطيافًا مركبة عامة أو أطوالًا ومحاور وأنواعًا أخرى أو حشوًا أو أداءً أو معنى قياسات فعلية.

الطيف المدخلالعكس الكاملFFT للجزء الحقيقي
[3,2,−1,4][2,1−0.5i,−1,1+0.5i][3,3,−1,3]
[3,3,−1,3][2,1,−1,1][3,3,−1,3]

للتوسع: ميزات فورييه العشوائية.

المراجع

  1. NumPy ifft
  2. NumPy DFT
  3. NumPy ifft versioned source

أُعدّ هذا المقال بمساعدة الذكاء الاصطناعي، وخضع لمراجعة ذاتية بالأداة نفسها. لا يُنسب إلى مراجع بشري أو خبير مستقل. منهجية المحتوى.