| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2011 Google Inc. All rights reserved. | 2 * Copyright (C) 2011 Google Inc. All rights reserved. |
| 3 * Copyright (C) 2012 Intel Inc. All rights reserved. | 3 * Copyright (C) 2012 Intel Inc. All rights reserved. |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
| 7 * are met: | 7 * are met: |
| 8 * | 8 * |
| 9 * 1. Redistributions of source code must retain the above copyright | 9 * 1. Redistributions of source code must retain the above copyright |
| 10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
| (...skipping 27 matching lines...) Expand all Loading... |
| 38 #include "wtf/MathExtras.h" | 38 #include "wtf/MathExtras.h" |
| 39 | 39 |
| 40 namespace blink { | 40 namespace blink { |
| 41 | 41 |
| 42 const unsigned maximumFFTPower2Size = 24; | 42 const unsigned maximumFFTPower2Size = 24; |
| 43 | 43 |
| 44 // Normal constructor: allocates for a given fftSize. | 44 // Normal constructor: allocates for a given fftSize. |
| 45 FFTFrame::FFTFrame(unsigned fftSize) | 45 FFTFrame::FFTFrame(unsigned fftSize) |
| 46 : m_FFTSize(fftSize) | 46 : m_FFTSize(fftSize) |
| 47 , m_log2FFTSize(static_cast<unsigned>(log2(fftSize))) | 47 , m_log2FFTSize(static_cast<unsigned>(log2(fftSize))) |
| 48 , m_complexData(fftSize) | |
| 49 , m_realData(fftSize / 2) | 48 , m_realData(fftSize / 2) |
| 50 , m_imagData(fftSize / 2) | 49 , m_imagData(fftSize / 2) |
| 50 , m_complexData(fftSize) |
| 51 { | 51 { |
| 52 // We only allow power of two. | 52 // We only allow power of two. |
| 53 ASSERT(1UL << m_log2FFTSize == m_FFTSize); | 53 ASSERT(1UL << m_log2FFTSize == m_FFTSize); |
| 54 ASSERT(m_log2FFTSize <= maximumFFTPower2Size); | 54 ASSERT(m_log2FFTSize <= maximumFFTPower2Size); |
| 55 | 55 |
| 56 ippsDFTInitAlloc_R_32f(&m_DFTSpec, m_FFTSize, IPP_FFT_NODIV_BY_ANY, ippAlgHi
ntFast); | 56 ippsDFTInitAlloc_R_32f(&m_DFTSpec, m_FFTSize, IPP_FFT_NODIV_BY_ANY, ippAlgHi
ntFast); |
| 57 int bufferSize = 0; | 57 int bufferSize = 0; |
| 58 ippsDFTGetBufSize_R_32f(m_DFTSpec, &bufferSize); | 58 ippsDFTGetBufSize_R_32f(m_DFTSpec, &bufferSize); |
| 59 m_buffer = ippsMalloc_8u(bufferSize); | 59 m_buffer = ippsMalloc_8u(bufferSize); |
| 60 } | 60 } |
| 61 | 61 |
| 62 // Creates a blank/empty frame (interpolate() must later be called). | 62 // Creates a blank/empty frame (interpolate() must later be called). |
| 63 FFTFrame::FFTFrame() | 63 FFTFrame::FFTFrame() |
| 64 : m_FFTSize(0) | 64 : m_FFTSize(0) |
| 65 , m_log2FFTSize(0) | 65 , m_log2FFTSize(0) |
| 66 { | 66 { |
| 67 } | 67 } |
| 68 | 68 |
| 69 // Copy constructor. | 69 // Copy constructor. |
| 70 FFTFrame::FFTFrame(const FFTFrame& frame) | 70 FFTFrame::FFTFrame(const FFTFrame& frame) |
| 71 : m_FFTSize(frame.m_FFTSize) | 71 : m_FFTSize(frame.m_FFTSize) |
| 72 , m_log2FFTSize(frame.m_log2FFTSize) | 72 , m_log2FFTSize(frame.m_log2FFTSize) |
| 73 , m_complexData(frame.m_FFTSize) | |
| 74 , m_realData(frame.m_FFTSize / 2) | 73 , m_realData(frame.m_FFTSize / 2) |
| 75 , m_imagData(frame.m_FFTSize / 2) | 74 , m_imagData(frame.m_FFTSize / 2) |
| 75 , m_complexData(frame.m_FFTSize) |
| 76 { | 76 { |
| 77 ippsDFTInitAlloc_R_32f(&m_DFTSpec, m_FFTSize, IPP_FFT_NODIV_BY_ANY, ippAlgHi
ntFast); | 77 ippsDFTInitAlloc_R_32f(&m_DFTSpec, m_FFTSize, IPP_FFT_NODIV_BY_ANY, ippAlgHi
ntFast); |
| 78 int bufferSize = 0; | 78 int bufferSize = 0; |
| 79 ippsDFTGetBufSize_R_32f(m_DFTSpec, &bufferSize); | 79 ippsDFTGetBufSize_R_32f(m_DFTSpec, &bufferSize); |
| 80 m_buffer = ippsMalloc_8u(bufferSize); | 80 m_buffer = ippsMalloc_8u(bufferSize); |
| 81 | 81 |
| 82 // Copy/setup frame data. | 82 // Copy/setup frame data. |
| 83 unsigned numberOfBytes = sizeof(float) * m_FFTSize; | 83 unsigned numberOfBytes = sizeof(float) * m_FFTSize; |
| 84 memcpy(realData(), frame.realData(), numberOfBytes); | 84 memcpy(realData(), frame.realData(), numberOfBytes); |
| 85 memcpy(imagData(), frame.imagData(), numberOfBytes); | 85 memcpy(imagData(), frame.imagData(), numberOfBytes); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 117 | 117 |
| 118 // Compute inverse transform. | 118 // Compute inverse transform. |
| 119 ippsDFTInv_PermToR_32f(complexP, reinterpret_cast<Ipp32f*>(data), m_DFTSpec,
m_buffer); | 119 ippsDFTInv_PermToR_32f(complexP, reinterpret_cast<Ipp32f*>(data), m_DFTSpec,
m_buffer); |
| 120 | 120 |
| 121 // Scale so that a forward then inverse FFT yields exactly the original data
. | 121 // Scale so that a forward then inverse FFT yields exactly the original data
. |
| 122 const float scale = 1.0 / m_FFTSize; | 122 const float scale = 1.0 / m_FFTSize; |
| 123 | 123 |
| 124 ippsMulC_32f_I(scale, reinterpret_cast<Ipp32f*>(data), m_FFTSize); | 124 ippsMulC_32f_I(scale, reinterpret_cast<Ipp32f*>(data), m_FFTSize); |
| 125 } | 125 } |
| 126 | 126 |
| 127 float* FFTFrame::realData() const | |
| 128 { | |
| 129 return const_cast<float*>(m_realData.data()); | |
| 130 } | |
| 131 | |
| 132 float* FFTFrame::imagData() const | |
| 133 { | |
| 134 return const_cast<float*>(m_imagData.data()); | |
| 135 } | |
| 136 | |
| 137 float* FFTFrame::getUpToDateComplexData() | 127 float* FFTFrame::getUpToDateComplexData() |
| 138 { | 128 { |
| 139 int len = m_FFTSize >> 1; | 129 int len = m_FFTSize >> 1; |
| 140 // Merge the real and imagimary vectors to complex vector. | 130 // Merge the real and imagimary vectors to complex vector. |
| 141 Ipp32f* realP = m_realData.data(); | 131 Ipp32f* realP = m_realData.data(); |
| 142 Ipp32f* imagP = m_imagData.data(); | 132 Ipp32f* imagP = m_imagData.data(); |
| 143 Ipp32fc* complexP = reinterpret_cast<Ipp32fc*>(m_complexData.data()); | 133 Ipp32fc* complexP = reinterpret_cast<Ipp32fc*>(m_complexData.data()); |
| 144 ippsRealToCplx_32f(realP, imagP, complexP, len); | 134 ippsRealToCplx_32f(realP, imagP, complexP, len); |
| 145 | 135 |
| 146 return const_cast<float*>(m_complexData.data()); | 136 return const_cast<float*>(m_complexData.data()); |
| 147 } | 137 } |
| 148 | 138 |
| 149 } // namespace blink | 139 } // namespace blink |
| 150 | 140 |
| 151 #endif // USE(WEBAUDIO_IPP) | 141 #endif // USE(WEBAUDIO_IPP) |
| 152 | 142 |
| 153 #endif // ENABLE(WEB_AUDIO) | 143 #endif // ENABLE(WEB_AUDIO) |
| OLD | NEW |