コード例 #1
0
void AudioAnalyzeFFT256::update(void)
{
    audio_block_t *block;

    block = receiveReadOnly();
    if (!block) return;
    if (!prevblock) {
        prevblock = block;
        return;
    }
    copy_to_fft_buffer(buffer, prevblock->data);
    copy_to_fft_buffer(buffer+256, block->data);
    //window = AudioWindowBlackmanNuttall256;
    //window = NULL;
    if (window) apply_window_to_fft_buffer(buffer, window);
    arm_cfft_radix4_q15(&fft_inst, buffer);
    // G. Heinzel's paper says we're supposed to average the magnitude
    // squared, then do the square root at the end.
    if (count == 0) {
        for (int i=0; i < 128; i++) {
            uint32_t tmp = *((uint32_t *)buffer + i);
            uint32_t magsq = multiply_16tx16t_add_16bx16b(tmp, tmp);
            sum[i] = magsq / naverage;
        }
    } else {
        for (int i=0; i < 128; i++) {
            uint32_t tmp = *((uint32_t *)buffer + i);
            uint32_t magsq = multiply_16tx16t_add_16bx16b(tmp, tmp);
            sum[i] += magsq / naverage;
        }
    }
    if (++count == naverage) {
        count = 0;
        for (int i=0; i < 128; i++) {
            output[i] = sqrt_uint32_approx(sum[i]);
        }
        outputflag = true;
    }
    release(prevblock);
    prevblock = block;
}
コード例 #2
0
void AudioAnalyzeFFT256::update(void)
{
	audio_block_t *block;

	block = receiveReadOnly();
	if (!block) return;
#if AUDIO_BLOCK_SAMPLES == 128
	if (!prevblock) {
		prevblock = block;
		return;
	}
	copy_to_fft_buffer(buffer, prevblock->data);
	copy_to_fft_buffer(buffer+256, block->data);
	//window = AudioWindowBlackmanNuttall256;
	//window = NULL;
	if (window) apply_window_to_fft_buffer(buffer, window);
	arm_cfft_radix4_q15(&fft_inst, buffer);
	// G. Heinzel's paper says we're supposed to average the magnitude
	// squared, then do the square root at the end.
	if (count == 0) {
		for (int i=0; i < 128; i++) {
			uint32_t tmp = *((uint32_t *)buffer + i);
			uint32_t magsq = multiply_16tx16t_add_16bx16b(tmp, tmp);
			sum[i] = magsq / naverage;
		}
	} else {
		for (int i=0; i < 128; i++) {
			uint32_t tmp = *((uint32_t *)buffer + i);
			uint32_t magsq = multiply_16tx16t_add_16bx16b(tmp, tmp);
			sum[i] += magsq / naverage;
		}
	}
	if (++count == naverage) {
		count = 0;
		for (int i=0; i < 128; i++) {
			output[i] = sqrt_uint32_approx(sum[i]);
		}
		outputflag = true;
	}
	release(prevblock);
	prevblock = block;
#elif AUDIO_BLOCK_SAMPLES == 64
	if (prevblocks[2] == NULL) {
		prevblocks[2] = prevblocks[1];
		prevblocks[1] = prevblocks[0];
		prevblocks[0] = block;
		return;
	}
	if (count == 0) {
		count = 1;
		copy_to_fft_buffer(buffer, prevblocks[2]->data);
		copy_to_fft_buffer(buffer+128, prevblocks[1]->data);
		copy_to_fft_buffer(buffer+256, prevblocks[1]->data);
		copy_to_fft_buffer(buffer+384, block->data);
		if (window) apply_window_to_fft_buffer(buffer, window);
		arm_cfft_radix4_q15(&fft_inst, buffer);
	} else {
		count = 2;
		const uint32_t *p = (uint32_t *)buffer;
		for (int i=0; i < 128; i++) {
			uint32_t tmp = *p++;
			int16_t v1 = tmp & 0xFFFF;
			int16_t v2 = tmp >> 16;
			output[i] = sqrt_uint32_approx(v1 * v1 + v2 * v2);
		}
	}
	release(prevblocks[2]);
	prevblocks[2] = prevblocks[1];
	prevblocks[1] = prevblocks[0];
	prevblocks[0] = block;
#endif
}
コード例 #3
0
ファイル: analyze_fft1024.cpp プロジェクト: A-L-E-X/Audio
void AudioAnalyzeFFT1024::update(void)
{
	audio_block_t *block;

	block = receiveReadOnly();
	if (!block) return;

	switch (state) {
	case 0:
		blocklist[0] = block;
		state = 1;
		break;
	case 1:
		blocklist[1] = block;
		state = 2;
		break;
	case 2:
		blocklist[2] = block;
		state = 3;
		break;
	case 3:
		blocklist[3] = block;
		state = 4;
		break;
	case 4:
		blocklist[4] = block;
		state = 5;
		break;
	case 5:
		blocklist[5] = block;
		state = 6;
		break;
	case 6:
		blocklist[6] = block;
		state = 7;
		break;
	case 7:
		blocklist[7] = block;
		// TODO: perhaps distribute the work over multiple update() ??
		//       github pull requsts welcome......
		copy_to_fft_buffer(buffer+0x000, blocklist[0]->data);
		copy_to_fft_buffer(buffer+0x100, blocklist[1]->data);
		copy_to_fft_buffer(buffer+0x200, blocklist[2]->data);
		copy_to_fft_buffer(buffer+0x300, blocklist[3]->data);
		copy_to_fft_buffer(buffer+0x400, blocklist[4]->data);
		copy_to_fft_buffer(buffer+0x500, blocklist[5]->data);
		copy_to_fft_buffer(buffer+0x600, blocklist[6]->data);
		copy_to_fft_buffer(buffer+0x700, blocklist[7]->data);
		if (window) apply_window_to_fft_buffer(buffer, window);
		arm_cfft_radix4_q15(&fft_inst, buffer);
		// TODO: support averaging multiple copies
		for (int i=0; i < 512; i++) {
			uint32_t tmp = *((uint32_t *)buffer + i); // real & imag
			uint32_t magsq = multiply_16tx16t_add_16bx16b(tmp, tmp);
			output[i] = sqrt_uint32_approx(magsq);
		}
		outputflag = true;
		release(blocklist[0]);
		release(blocklist[1]);
		release(blocklist[2]);
		release(blocklist[3]);
		blocklist[0] = blocklist[4];
		blocklist[1] = blocklist[5];
		blocklist[2] = blocklist[6];
		blocklist[3] = blocklist[7];
		state = 4;
		break;
	}
}