Audio Spectrum analyser - FFT using mbed-dsp - driving RGB(W) LED or PC python script.

Dependencies:   HSI2RGBW_PWM NVIC_set_all_priorities mbed-dsp mbed FastAnalogIn

Spectrum Analyzer

Code ported from Tony DiCola at AdaFruit FFT: Fun with Fourier Transforms.
Modifications were made to allow the use of the KL25Z on-board RGB LED or an external RGBW power LED.
See items marked with * in the next sections.

Main features

  • Uses mbed-dsp library.
  • Uses FastAnalogIn to allow a sample rate of 40kHz.
  • Display the audio spectrum on a single RGB(W) LED*.
  • Display the audio spectrum on your computer using an audio spectrogram tool (python script).
  • Change parameters using a terminal connection : Sample rate, min/max db, slowdown*.

Information

Detailed information and download of the python scripts is available here.

KL25Z wiring

Audio inputs
The software samples a single audio channel at 40kHz and applies a Fourier transform to return the frequency spectrum.
Analog input : PTC2.
A DC offset, and possibly some amplification or attenuation, is needed before the signal is fed into the analog inputs.
The opamp choice is not critical, just make sure it supports single supply operation.
Schematic
Currently, only one channel is used when the KL25Z is sampling at 40kHz.
/media/uploads/frankvnk/opamp_input_stage-tlc2264.png

External PWM outputs

PinColor
PTD4Red
PTA12Green
PTA4Blue
PTA5White

If you want to use a RGB LED, remove the last pin declaration (PTA5).
The conversion routine automatically switches from HSI/RGBW to HSI/RGB.
To use the external RGBW LED, enable following line in the code:

#define RGBW_ext // Disable this line when you want to use the KL25Z on-board RGB LED.

Commands

Parameters can be altered through the serial port Using a terminal program (eg : TeraTerm).
Communication settings : 38400 baud + local echo.
Each command needs to be terminated with a semicolon.
Use GET <command>; to read a parameter.
Use SET <command> <value>; to set a parameter.

CommandDescription
GET MAGNITUDES;Reads back the FFT magnitudes.
Number of magnitudes = PIXEL_COUNT.
GET SAMPLES;Reads back the current samples.
Number of samples = PIXEL_COUNT.
GET FFT_SIZE;The size of the FFT.
GET SAMPLE_RATE_HZ;Audio sample rate (Hz).
SET SAMPLE_RATE_HZ <value>;Change the audio sample rate (see also 'Limitations' below).
GET LEDS_ENABLED;LEDs enabled status.
SET LEDS_ENABLED <value>;Control if the LED's should display the spectrum or not.
1 is true, 0 is false.
GET SPECTRUM_MIN_DB;Audio intensity (in decibels) that maps to low LED brightness.
SET SPECTRUM_MIN_DB <value>;Change low sensitivity (0...100dB).
GET SPECTRUM_MAX_DB;Audio intensity (in decibels) that maps to high LED brightness.
SET SPECTRUM_MAX_DB <value>;Change high sensitivity (0...100dB).
GET SLOWDOWN;LED visualisation delay.
SET SLOWDOWN <value>;* Useful to visualize the spectrum using a single RGB(W) LED.
Without this command, the color values are shown too fast for the human eye.
This allows you to slow down the visualization without interfering in the FFT conversion.
Each frequency window is shown a little longer.
The number of frequency windows depends on the value of the PIXEL_COUNT variable.
[0...999] The larger the value, the longer each frequency window is shown - a good value is 4 when PIXEL_COUNT = 32 (choose a higher SLOWDOWN value when PIXEL_COUNT is lowered).
[1000...1000 + PIXEL_COUNT] Selecting a value within this range allows us to lock to a specific frequency window.

NOTE : PIXEL_COUNT is declared at compile time and determines the number of frequency windows (aka LED colors).

Limitations

The original code was written for a cortex-M4 processor.
For a cortex-M0 processor, following limitations apply:

SAMPLE_RATE_HZFFT_SIZE
1...40000max 64

Demo Videos

Parameter settings

SLOWDOWN16 (initial value - changed to 1000+ during the video to demonstrate the lock option).
SAMPLE_RATE_HZ40000
SPECTRUM_MIN_DB40.0
SPECTRUM_MAX_DB80.0
FFT_SIZE64
PIXEL_COUNT32

Using the on-board RGB LED
SLOWDOWN is set to different values (normal mode and locked mode).

Using an external 10W RGBW LED
SLOWDOWN is set to different values (normal mode and locked mode).

Spectrogram on Computer screen (serial input from KL25Z board

Committer:
frankvnk
Date:
Sat Mar 08 19:30:20 2014 +0000
Revision:
2:035d551759a5
Parent:
1:736b34e0f484
Replaced deprecated FFT calls with new ones.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
frankvnk 1:736b34e0f484 1 /* ----------------------------------------------------------------------
frankvnk 1:736b34e0f484 2 * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
frankvnk 1:736b34e0f484 3 *
frankvnk 1:736b34e0f484 4 * $Date: 17. January 2013
frankvnk 1:736b34e0f484 5 * $Revision: V1.4.1
frankvnk 1:736b34e0f484 6 *
frankvnk 1:736b34e0f484 7 * Project: CMSIS DSP Library
frankvnk 1:736b34e0f484 8 * Title: arm_const_structs.h
frankvnk 1:736b34e0f484 9 *
frankvnk 1:736b34e0f484 10 * Description: This file has constant structs that are initialized for
frankvnk 1:736b34e0f484 11 * user convenience. For example, some can be given as
frankvnk 1:736b34e0f484 12 * arguments to the arm_cfft_f32() function.
frankvnk 1:736b34e0f484 13 *
frankvnk 1:736b34e0f484 14 * Target Processor: Cortex-M4/Cortex-M3
frankvnk 1:736b34e0f484 15 *
frankvnk 1:736b34e0f484 16 * Redistribution and use in source and binary forms, with or without
frankvnk 1:736b34e0f484 17 * modification, are permitted provided that the following conditions
frankvnk 1:736b34e0f484 18 * are met:
frankvnk 1:736b34e0f484 19 * - Redistributions of source code must retain the above copyright
frankvnk 1:736b34e0f484 20 * notice, this list of conditions and the following disclaimer.
frankvnk 1:736b34e0f484 21 * - Redistributions in binary form must reproduce the above copyright
frankvnk 1:736b34e0f484 22 * notice, this list of conditions and the following disclaimer in
frankvnk 1:736b34e0f484 23 * the documentation and/or other materials provided with the
frankvnk 1:736b34e0f484 24 * distribution.
frankvnk 1:736b34e0f484 25 * - Neither the name of ARM LIMITED nor the names of its contributors
frankvnk 1:736b34e0f484 26 * may be used to endorse or promote products derived from this
frankvnk 1:736b34e0f484 27 * software without specific prior written permission.
frankvnk 1:736b34e0f484 28 *
frankvnk 1:736b34e0f484 29 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
frankvnk 1:736b34e0f484 30 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
frankvnk 1:736b34e0f484 31 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
frankvnk 1:736b34e0f484 32 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
frankvnk 1:736b34e0f484 33 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
frankvnk 1:736b34e0f484 34 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
frankvnk 1:736b34e0f484 35 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
frankvnk 1:736b34e0f484 36 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
frankvnk 1:736b34e0f484 37 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
frankvnk 1:736b34e0f484 38 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
frankvnk 1:736b34e0f484 39 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
frankvnk 1:736b34e0f484 40 * POSSIBILITY OF SUCH DAMAGE.
frankvnk 1:736b34e0f484 41 * -------------------------------------------------------------------- */
frankvnk 1:736b34e0f484 42
frankvnk 1:736b34e0f484 43 #ifndef _ARM_CONST_STRUCTS_H
frankvnk 1:736b34e0f484 44 #define _ARM_CONST_STRUCTS_H
frankvnk 1:736b34e0f484 45
frankvnk 1:736b34e0f484 46 #include "arm_math.h"
frankvnk 1:736b34e0f484 47 #include "arm_common_tables.h"
frankvnk 1:736b34e0f484 48
frankvnk 1:736b34e0f484 49 const arm_cfft_instance_f32 arm_cfft_sR_f32_len16 = {
frankvnk 1:736b34e0f484 50 16, twiddleCoef_16, armBitRevIndexTable16, ARMBITREVINDEXTABLE__16_TABLE_LENGTH
frankvnk 1:736b34e0f484 51 };
frankvnk 1:736b34e0f484 52
frankvnk 1:736b34e0f484 53 const arm_cfft_instance_f32 arm_cfft_sR_f32_len32 = {
frankvnk 1:736b34e0f484 54 32, twiddleCoef_32, armBitRevIndexTable32, ARMBITREVINDEXTABLE__32_TABLE_LENGTH
frankvnk 1:736b34e0f484 55 };
frankvnk 1:736b34e0f484 56
frankvnk 1:736b34e0f484 57 const arm_cfft_instance_f32 arm_cfft_sR_f32_len64 = {
frankvnk 1:736b34e0f484 58 64, twiddleCoef_64, armBitRevIndexTable64, ARMBITREVINDEXTABLE__64_TABLE_LENGTH
frankvnk 1:736b34e0f484 59 };
frankvnk 1:736b34e0f484 60
frankvnk 1:736b34e0f484 61 const arm_cfft_instance_f32 arm_cfft_sR_f32_len128 = {
frankvnk 1:736b34e0f484 62 128, twiddleCoef_128, armBitRevIndexTable128, ARMBITREVINDEXTABLE_128_TABLE_LENGTH
frankvnk 1:736b34e0f484 63 };
frankvnk 1:736b34e0f484 64
frankvnk 1:736b34e0f484 65 const arm_cfft_instance_f32 arm_cfft_sR_f32_len256 = {
frankvnk 1:736b34e0f484 66 256, twiddleCoef_256, armBitRevIndexTable256, ARMBITREVINDEXTABLE_256_TABLE_LENGTH
frankvnk 1:736b34e0f484 67 };
frankvnk 1:736b34e0f484 68
frankvnk 1:736b34e0f484 69 const arm_cfft_instance_f32 arm_cfft_sR_f32_len512 = {
frankvnk 1:736b34e0f484 70 512, twiddleCoef_512, armBitRevIndexTable512, ARMBITREVINDEXTABLE_512_TABLE_LENGTH
frankvnk 1:736b34e0f484 71 };
frankvnk 1:736b34e0f484 72
frankvnk 1:736b34e0f484 73 const arm_cfft_instance_f32 arm_cfft_sR_f32_len1024 = {
frankvnk 1:736b34e0f484 74 1024, twiddleCoef_1024, armBitRevIndexTable1024, ARMBITREVINDEXTABLE1024_TABLE_LENGTH
frankvnk 1:736b34e0f484 75 };
frankvnk 1:736b34e0f484 76
frankvnk 1:736b34e0f484 77 const arm_cfft_instance_f32 arm_cfft_sR_f32_len2048 = {
frankvnk 1:736b34e0f484 78 2048, twiddleCoef_2048, armBitRevIndexTable2048, ARMBITREVINDEXTABLE2048_TABLE_LENGTH
frankvnk 1:736b34e0f484 79 };
frankvnk 1:736b34e0f484 80
frankvnk 1:736b34e0f484 81 const arm_cfft_instance_f32 arm_cfft_sR_f32_len4096 = {
frankvnk 1:736b34e0f484 82 4096, twiddleCoef_4096, armBitRevIndexTable4096, ARMBITREVINDEXTABLE4096_TABLE_LENGTH
frankvnk 1:736b34e0f484 83 };
frankvnk 1:736b34e0f484 84
frankvnk 1:736b34e0f484 85 #endif
frankvnk 1:736b34e0f484 86