LED矩阵上的音频可视化器

0 投票
1 回答
1912 浏览
提问于 2025-04-18 11:20

我想做的是播放一个音频文件,并把它的内容在一个8x8的矩阵上显示出来,像Piccolo那样,类似于为BeagleBone或Raspberry Pi改编的频谱分析仪。这不需要用麦克风进行环境分析,只是在同一个设备上播放音乐时进行可视化。

Adafruit制作了一个库,让控制LED矩阵变得简单,但缺少的主要是将音频分析转换成每个音频片段对应的矩阵。

可以使用C或C++语言,但如果用Python代码就更好了。为此,有一些不错的库,比如Timesideaubio,但我还没找到如何像在Piccolo中那样填充LED矩阵,尽管我测试了一些示例。

1 个回答

2

要在Python中使用numpy获取一个简单的8频段、8级的持续光谱估计,可以参考下面的代码:

import numpy as np

fftsize = 4096  # about 100ms at 44 kHz; each bin will be ~ 10 Hz
# Band edges to define 8 octave-wide ranges in the FFT output
binedges = [8, 16, 32, 64, 128, 256, 512, 1024, 2048]
nbins = len(binedges)-1
# offsets to get our 48 dB range onto something useful, per band
offsets = [4, 4, 4, 4, 6, 8, 10, 12]
# largest value in ledval
nleds = 8
# scaling of LEDs per doubling in amplitude
ledsPerDoubling = 1.0
# initial value of per-band energy history
binval = 0.001 * np.ones(nbins, np.float)
newbinval = np.zeros(nbins, np.float)
# How rapidly the displays decay after a peak (depends on how often we're called)
decayConst = 0.9

if not_done:
    # somehow tap into the most recent 30-100ms of audio.  
    # Assume we get 44 kHz mono back
    waveform = get_latest_waveform()
    # find spectrum
    spectrum = np.abs(np.fft.rfft(waveform[:fftsize]))
    # gather into octave bands
    for i in range(nbins-1):
        newbinval[i] = np.mean(spectrum[binedges[i]:binedges[i+1]])
    # Peak smoothing - decay slowly after large values
    binval = np.maximum(newbinval, decayConst*binval)
    # Quantize into values 0..8 as the number of leds to light in each column
    ledval = np.round(np.maximum(0, np.minimum(nleds, 
                                               ledsPerDoubling * np.log2(binval) 
                                               + offsets)))
    # Now illuminate ledval[i] LEDs in column i (0..7) ...

除了获取最新的4096个数据点的波形,这段代码应该能让你明白大概的意思。

撰写回答