|  | /* | 
|  | *  Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. | 
|  | * | 
|  | *  Use of this source code is governed by a BSD-style license | 
|  | *  that can be found in the LICENSE file in the root of the source | 
|  | *  tree. An additional intellectual property rights grant can be found | 
|  | *  in the file PATENTS.  All contributing project authors may | 
|  | *  be found in the AUTHORS file in the root of the source tree. | 
|  | */ | 
|  |  | 
|  | #ifndef WEBRTC_MODULES_AUDIO_PROCESSING_BEAMFORMER_COMPLEX_MATRIX_H_ | 
|  | #define WEBRTC_MODULES_AUDIO_PROCESSING_BEAMFORMER_COMPLEX_MATRIX_H_ | 
|  |  | 
|  | #include <complex> | 
|  |  | 
|  | #include "webrtc/base/checks.h" | 
|  | #include "webrtc/modules/audio_processing/beamformer/matrix.h" | 
|  |  | 
|  | namespace webrtc { | 
|  |  | 
|  | using std::complex; | 
|  |  | 
|  | // An extension of Matrix for operations that only work on a complex type. | 
|  | template <typename T> | 
|  | class ComplexMatrix : public Matrix<complex<T> > { | 
|  | public: | 
|  | ComplexMatrix() : Matrix<complex<T> >() {} | 
|  |  | 
|  | ComplexMatrix(size_t num_rows, size_t num_columns) | 
|  | : Matrix<complex<T> >(num_rows, num_columns) {} | 
|  |  | 
|  | ComplexMatrix(const complex<T>* data, size_t num_rows, size_t num_columns) | 
|  | : Matrix<complex<T> >(data, num_rows, num_columns) {} | 
|  |  | 
|  | // Complex Matrix operations. | 
|  | ComplexMatrix& PointwiseConjugate() { | 
|  | complex<T>* const data = this->data(); | 
|  | size_t size = this->num_rows() * this->num_columns(); | 
|  | for (size_t i = 0; i < size; ++i) { | 
|  | data[i] = conj(data[i]); | 
|  | } | 
|  |  | 
|  | return *this; | 
|  | } | 
|  |  | 
|  | ComplexMatrix& PointwiseConjugate(const ComplexMatrix& operand) { | 
|  | this->CopyFrom(operand); | 
|  | return PointwiseConjugate(); | 
|  | } | 
|  |  | 
|  | ComplexMatrix& ConjugateTranspose() { | 
|  | this->CopyDataToScratch(); | 
|  | size_t num_rows = this->num_rows(); | 
|  | this->SetNumRows(this->num_columns()); | 
|  | this->SetNumColumns(num_rows); | 
|  | this->Resize(); | 
|  | return ConjugateTranspose(this->scratch_elements()); | 
|  | } | 
|  |  | 
|  | ComplexMatrix& ConjugateTranspose(const ComplexMatrix& operand) { | 
|  | RTC_CHECK_EQ(operand.num_rows(), this->num_columns()); | 
|  | RTC_CHECK_EQ(operand.num_columns(), this->num_rows()); | 
|  | return ConjugateTranspose(operand.elements()); | 
|  | } | 
|  |  | 
|  | ComplexMatrix& ZeroImag() { | 
|  | complex<T>* const data = this->data(); | 
|  | size_t size = this->num_rows() * this->num_columns(); | 
|  | for (size_t i = 0; i < size; ++i) { | 
|  | data[i] = complex<T>(data[i].real(), 0); | 
|  | } | 
|  |  | 
|  | return *this; | 
|  | } | 
|  |  | 
|  | ComplexMatrix& ZeroImag(const ComplexMatrix& operand) { | 
|  | this->CopyFrom(operand); | 
|  | return ZeroImag(); | 
|  | } | 
|  |  | 
|  | private: | 
|  | ComplexMatrix& ConjugateTranspose(const complex<T>* const* src) { | 
|  | complex<T>* const* elements = this->elements(); | 
|  | for (size_t i = 0; i < this->num_rows(); ++i) { | 
|  | for (size_t j = 0; j < this->num_columns(); ++j) { | 
|  | elements[i][j] = conj(src[j][i]); | 
|  | } | 
|  | } | 
|  |  | 
|  | return *this; | 
|  | } | 
|  | }; | 
|  |  | 
|  | }  // namespace webrtc | 
|  |  | 
|  | #endif  // WEBRTC_MODULES_AUDIO_PROCESSING_BEAMFORMER_COMPLEX_MATRIX_H_ |