Nicla Vision audio spectrogram

Hi everyone, I’m new in arduino boards, OpenMV and also in Phyton.
I have an Arduino Nicla Vision and I’m trying to extract audio data from integrated microphone. I’ve started using the tutorial code (audio_fft) but I can’t solve anyway this AttributError: ‘module’ object has not attribute ‘spectrogram’.

I don’t know if the problem is a missing library, but I haven’t found how to install it on OpenMV.
Thank you.
This is the code:

import image, audio, time
from ulab import numpy as np
from ulab import scipy as sp

CHANNELS = 1
SIZE = 256//(2*CHANNELS)

raw_buf = None
fb = image.Image(SIZE+50, SIZE, image.RGB565, copy_to_fb=True)
audio.init(channels=CHANNELS, frequency=16000, gain_db=24, highpass=0.9883)

def audio_callback(buf):
    # NOTE: do Not call any function that allocates memory.
    global raw_buf
    if (raw_buf == None):
        raw_buf = buf

# Start audio streaming
audio.start_streaming(audio_callback)

def draw_fft(img, fft_buf):
    fft_buf = (fft_buf / max(fft_buf)) * SIZE
    fft_buf = np.log10(fft_buf + 1) * 20
    color = (0xFF, 0x0F, 0x00)
    for i in range(0, SIZE):
        img.draw_line(i, SIZE, i, SIZE-int(fft_buf[i]), color, 1)

def draw_audio_bar(img, level, offset):
    blk_size = SIZE//10
    color = (0xFF, 0x00, 0xF0)
    blk_space = (blk_size//4)
    for i in range(0, int(round(level/10))):
        fb.draw_rectangle(SIZE+offset, SIZE - ((i+1)*blk_size) + blk_space, 20, blk_size - blk_space, color, 1, True)

while (True):
    if (raw_buf != None):
        pcm_buf = np.frombuffer(raw_buf, dtype=np.int16)
        raw_buf = None

        if CHANNELS == 1:
            fft_buf = sp.signal.spectrogram(pcm_buf)
            l_lvl = int((np.mean(abs(pcm_buf[1::2])) / 32768)*100)
        else:
            fft_buf = sp.signal.spectrogram(pcm_buf[0::2])
            l_lvl = int((np.mean(abs(pcm_buf[1::2])) / 32768)*100)
            r_lvl = int((np.mean(abs(pcm_buf[0::2])) / 32768)*100)

        fb.clear()
        draw_fft(fb, fft_buf)
        draw_audio_bar(fb, l_lvl, 0)
        if CHANNELS == 2:
            draw_audio_bar(fb, r_lvl, 25)
        fb.flush()

# Stop streaming
audio.stop_streaming()`Preformatted text`

@iabdalkader

This example should work, are you on the latest firmware ?

my filmware is latest and i have same problem

Yes, OpenMV has upload it right before I’ve tried to execute the code

Okay ulab moved that function from sp.signal to utils, you just need to use utils instead, i.e:

from ulab import utils
fft_buf = utils.spectrogram(...)

We will update the examples very soon.

1 Like

is it possible to save the audio record in wav format

Not sure if that’s possible on the Nicla. On our M4/M7/H7 line we do support doing this via the ADC pin.

I’m trying to do that here with this code: Problem-loss of Audio data from Arduino Nicla vision to Computer - Interfacing w/ Software on the Computer - Arduino Forum

I saved a .wav file but I’ve some problems…

Okay, you should be able to get support form Arduino there. You are using their C library.