All files main.js

100% Statements 106/106
100% Branches 6/6
100% Functions 1/1
100% Lines 106/106

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 1071x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 10x 10x 10x 10x 10x 10x 10x 10x 1x 1x 9x 9x 9x 9x 9x 9x 9x 9x 9x 9x 9x 9x 9x 9x 9x 9x 9x 9x 9x 9x 9x 9x 9x 9x 9x 10x 7x 7x 7x 9x 10x 1x 1x 1x 1x 1x  
/**
* @license Apache-2.0
*
* Copyright (c) 2026 The Stdlib Authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*    http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
 
'use strict';
 
// MODULES //
 
var isEven = require( '@stdlib/math/base/assert/is-even' );
var floor = require( '@stdlib/math/base/special/floor' );
var reinterpret = require( '@stdlib/strided/base/reinterpret-complex128' );
 
 
// MAIN //
 
/**
* Converts a real-valued double-precision floating-point array in FFTPACK half-complex format to a double-precision complex floating-point array.
*
* @param {NonNegativeInteger} N - length of the original real sequence
* @param {Float64Array} hc - input array in FFTPACK half-complex format
* @param {integer} strideHc - stride length for `hc`
* @param {NonNegativeInteger} offsetHc - starting index for `hc`
* @param {Complex128Array} out - output complex array
* @param {integer} strideOut - stride length for `out`
* @param {NonNegativeInteger} offsetOut - starting index for `out`
* @returns {Complex128Array} output complex array
*
* @example
* var Float64Array = require( '@stdlib/array/float64' );
* var Complex128Array = require( '@stdlib/array/complex128' );
* var floor = require( '@stdlib/math/base/special/floor' );
* var rffti = require( '@stdlib/fft/base/fftpack/float64/rffti' );
* var rfftf = require( '@stdlib/fft/base/fftpack/float64/rfftf' );
*
* var N = 4;
* var w = new Float64Array( ( 2*N ) + 34 );
* rffti( N, w, 1, 0 );
*
* var r = new Float64Array( [ 1.0, 2.0, 3.0, 4.0 ] );
* rfftf( N, r, 1, 0, w, 1, 0 );
* // r => <Float64Array>[ 10.0, -2.0, 2.0, -2.0 ]
*
* var out = new Complex128Array( floor( N/2 ) + 1 );
* hc2c( N, r, 1, 0, out, 1, 0 );
* // out => <Complex128Array>[ 10.0, 0.0, -2.0, 2.0, -2.0, 0.0 ]
*/
function hc2c( N, hc, strideHc, offsetHc, out, strideOut, offsetOut ) {
	var view;
	var so;
	var io;
	var M;
	var k;
 
	if ( N <= 0 ) {
		return out;
	}
	// Reinterpret the complex output array as a real-valued array of interleaved real and imaginary components:
	view = reinterpret( out, 0 );
 
	// Adjust the stride and offset for the real-valued view:
	so = strideOut * 2;
	io = offsetOut * 2;
 
	// Resolve the number of interior complex coefficients:
	M = floor( ( N - 1 ) / 2 );
 
	// DC component:
	view[ io ] = hc[ offsetHc ];
	view[ io + 1 ] = 0.0; // Always purely real
	offsetHc += strideHc;
	io += so;
 
	// Complex coefficients for frequencies k = 1, ..., M:
	for ( k = 0; k < M; k++ ) {
		view[ io ] = hc[ offsetHc ];                // real part
		view[ io + 1 ] = hc[ offsetHc + strideHc ]; // imaginary part
		offsetHc += 2 * strideHc;
		io += so;
	}
 
	// Nyquist component (only when N is even):
	if ( isEven( N ) ) {
		view[ io ] = hc[ offsetHc ];
		view[ io + 1 ] = 0.0; // Always purely real
	}
	return out;
}
 
 
// EXPORTS //
 
module.exports = hc2c;