تقنية

ifftshift: هل يكفي تكرار fftshift لاستعادة الترتيب؟

المساران بعد الإزاحة الأولى.
مقارنة صحيحة بلا تقريب.

ifftshift هو عكس fftshift، وتختلف إزاحتاهما للطول الفردي. [1] نختبر الترتيب بخمس قيم مميزة، ثم بتحكم زوجي.

تتبع القيم بعد الإزاحة الأولى

تنقل fftshift خانة التردد صفر إلى وسط الطيف. [2] سنستعمل قائمة تعليمية لتتبع المواضع فقط؛ لم نحسب طيفًا أو ترددات، وقيمنا ليست محورًا بالهرتز.

نختار x=[10,20,30,40,50] من نوع int64، بفهرسة من صفر إلى 4. هذه أعداد مميزة عمدًا، حتى نرى أين ذهبت كل قيمة. لا نعطيها وحدات قياس ولا معنى لإشارة مسجلة.

على NumPy 2.3.5، أعاد np.fft.fftshift(x) القائمة S=[40,50,10,20,30]. صارت القيمة 10، التي كانت عند الفهرس صفر، في الموضع 2؛ وصارت 40 في الموضع صفر.

عندما طبقنا np.fft.fftshift(S)، حصلنا على [20,30,40,50,10]. لم نستعد الأصل: الفهرس صفر يحوي 20 بدل 10. حفظنا القيم الخمس نفسها، لكن مواقعها تغيرت.

كذلك مجموع القيم بقي 150 في القوائم الثلاث. حسبنا هذا الجمع مباشرة؛ وهو يوضح أن فحص المجموع وحده لا يكشف خطأ الترتيب. نحتاج مقارنة كل موضع بما كان فيه.

لماذا يعيد العكس المسمى الأصل؟

في تنفيذ الإصدار 2.3.5، تختار fftshift إزاحة مقدارها floor(N/2)، وتختار ifftshift سالب ذلك المقدار على المحور. [3] نطبق هذا الوصف هنا على قائمة أحادية البعد.

عند N=5، مقدار الإزاحة الأولى 2. نكتب الناتج عند j على الصورة x[(j−2) mod 5]، حيث mod يختار باقيًا من صفر إلى 4. عند j=0 نقرأ x[3]=40؛ وعند j=2 نقرأ x[0]=10.

تكرار الإزاحة نفسها يجعل الفهرس x[(j−4) mod 5]. لأن −4 يكافئ +1 ضمن حلقة من خمس خانات، نقرأ x[(j+1) mod 5]؛ لهذا تبدأ النتيجة بـ20 ثم 30، وتعود 10 إلى النهاية.

أما إزاحة −2 بعد +2 فتلغي انتقال المواضع. عند تطبيق ifftshift(S) أعاد التشغيل [10,20,30,40,50] بالضبط. لم نستعمل سماحية عشرية؛ الأعداد صحيحة والقيم المتقابلة متساوية.

في نموذج الفهارس، إذا N=2m+1، فتكرار مقدار m يعطي 2m=N−1؛ يظل دورانًا خطوة في الاتجاه المقابل. هذه نتيجة جبرية لمقدار الإزاحة المذكور، وليست ادعاء بأن كل قائمة فردية ستظهر قيمًا مختلفة بعده.

التحكم الزوجي والقيم المتساوية

نختار تحكمًا مستقلًا بطول أربع: b=[10,20,30,40]. الإزاحة الأولى أعطت [30,40,10,20]، ثم أعاد تكرار fftshift القائمة [10,20,30,40]. كما أعادها تطبيق ifftshift على الإزاحة الأولى.

في نموذج N=4، الإزاحتان +2 ثم +2 تجمعان إلى أربع خانات، أي دورة كاملة. الاختبار الزوجي ناجح، لكنه لا يغطي فرق الخانة المتبقية في نموذج الخمس.

يوجد تحكم فردي أيضًا داخل شبكة الاختبار: [3,3,3,3,3]. بعد أي من الإزاحتين تبقى القيم المعروضة [3,3,3,3,3]. تساوي القيم لا يثبت أن كل عنصر عاد إلى موضعه؛ المواضع المختلفة تحمل القيمة نفسها.

من شبكة {−2,0,3} ذات الطول خمس، القوائم الثابتة الثلاث هي حالات اتفاق التكرار مع الأصل. يضاف إليها التحكم الزوجي، فيصبح الاتفاق أربع حالات. في 241 حالة أخرى اختلفت قائمة التكرار عن الأصل.

لذلك اختر قيمًا مميزة حين تختبر ترتيبًا، أو احفظ فهارس المواضع بجانب البيانات. المثال الثابت صالح لكشف محدودية اختبار القيم المتكررة، لكنه لا يبرر استبدال العملية العكسية بالتكرار.

فهارس الخمس والتحكم الزوجي.
القيم المتساوية تخفي اختلاف المواضع.

ما الذي تحققنا منه فعلًا؟

شغلنا 245 حالة: مثال الخمس المميز، وجميع قوائم الطول خمس من {−2,0,3} وعددها 243، وتحكم الأربع. لكل حالة مصفوفة مدخل جديدة، ثم إزاحة أولى استعملنا ناتجها نفسه في المسارين اللاحقين.

المجموع 735 استدعاءً مسمى لدالتي fftshift وifftshift، و3672 عنصرًا صحيحًا في مصفوفات المخرجات الثلاث. إنشاء 245 مصفوفة مدخل خارج عدد استدعاءات الإزاحة؛ واستدعاءات المساعدات الداخلية خارج هذا العد أيضًا.

كتبنا مرجعًا مستقلًا بفهرسة modulo من القوائم المؤلفة، دون np.roll أو استعمال خرج الإزاحة كجواب منتظر. قارنا القيم الصحيحة بالضبط، وتحققنا من الشكل والنوع وبقاء بايتات المدخل والإزاحة الأولى دون تغيير بعد الاستدعاءات.

كل مسار ifftshift بعد fftshift أعاد الأصل في الحالات المحفوظة. لم ينفذ الاختبار تحويل فورييه، رغم وجود الدالتين ضمن np.fft؛ ولم نقس زمنًا أو ذاكرة أو مشاركة التخزين.

نقصر نتيجة التشغيل على مصفوفات int64 أحادية البعد بطولي خمس وأربع، مع المحور الافتراضي. المحاور المتعددة والأصناف المخصصة تحتاج اختبارًا خاصًا. في المسار الذي تستخدمه، سجل العملية الأولى واختر عكسها، ثم راجع الترتيب على مدخل يكشف اختلاف المواضع.

المدخلالإزاحة الأولىالتكرارالعكس المسمى
[10,20,30,40,50][40,50,10,20,30][20,30,40,50,10]الأصل
[10,20,30,40][30,40,10,20]الأصلالأصل
[3,3,3,3,3]كل القيم 3كل القيم 3كل القيم 3

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

المراجع

  1. NumPy ifftshift
  2. NumPy fftshift
  3. NumPy shift code

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