1e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent/* 2e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. 3e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * 4e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Use of this source code is governed by a BSD-style license 5e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * that can be found in the LICENSE file in the root of the source 6e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * tree. An additional intellectual property rights grant can be found 7e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * in the file PATENTS. All contributing project authors may 8e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * be found in the AUTHORS file in the root of the source tree. 9e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent */ 10e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 11e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 12e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent/* 13e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * This file contains the function WebRtcSpl_ComplexBitReverse(). 14e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * The description header can be found in signal_processing_library.h 15e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * 16e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent */ 17e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 18e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#include "signal_processing_library.h" 19e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 20e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentvoid WebRtcSpl_ComplexBitReverse(WebRtc_Word16 frfi[], int stages) 21e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{ 22e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent int mr, nn, n, l, m; 23e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent WebRtc_Word16 tr, ti; 24e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 25e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent n = 1 << stages; 26e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 27e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent mr = 0; 28e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent nn = n - 1; 29e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 30e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // decimation in time - re-order data 31e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent for (m = 1; m <= nn; ++m) 32e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 33e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent l = n; 34e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent do 35e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 36e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent l >>= 1; 37e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } while (mr + l > nn); 38e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent mr = (mr & (l - 1)) + l; 39e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 40e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if (mr <= m) 41e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent continue; 42e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 43e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent tr = frfi[2 * m]; 44e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent frfi[2 * m] = frfi[2 * mr]; 45e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent frfi[2 * mr] = tr; 46e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 47e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ti = frfi[2 * m + 1]; 48e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent frfi[2 * m + 1] = frfi[2 * mr + 1]; 49e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent frfi[2 * mr + 1] = ti; 50e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 51e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 52