花环控制算法的快速原型
在新年前夕,你总是想营造一种特殊的氛围。 这个例子展示了如何使用KPM节奏,你可以开发一个算法来控制一个LED花环,它将改变它的亮度取决于音乐的音量,创造"跳舞的灯光"的效果。"
此示例演示如何使用实时机器KPM RHYTHM进行控制算法的快速原型设计。 控制对象为LED花环。 控制算法根据音乐的音量来调整花环的亮度。 首先,使用脚本处理音频文件,然后将接收到的信号加载到KPM节奏模型中。
在KPM RHYTHM上运行的模型包含一个子系统 Звуковой сигнал,其中从工作区加载处理的音频文件幅度值的向量。 在前2秒,子系统输出音频同步的值1。 信号循环播放—到达音频文件的末尾后,从头开始播放。
信号的幅度(其值从0到1)乘以-5的电压增益因子。 该系数具有负值,因为必须将低于阳极的电压施加到LED的阴极。
放大的信号然后被施加到单元 GP-AD-24 DAC,其控制内置的数模转换模块(DAC)。 DAC的最大输出电压为±10V,但花环的工作电压为100V.因此,花环通过放大器连接到KPM节奏。 Ponovo PA460Bi,其将来自DAC的输出电压放大20倍。 花环由两个led链组成,公共阳极连接到地,负电压施加到阴极。
花环连接图:
下面是用于处理格式的音频文件的脚本 WAV. 在脚本中执行以下操作:
- 下载必要的库;
- 读取音频文件;
- 数据提取;
- 数据放电至0.01s步骤;
- 幅度的归一化;
- 幂律压缩以增强弱振幅值;
- 指数平滑;
- 平滑后的归一化。
using Pkg
!("FileIO" in [p.name for p in values(Pkg.dependencies())]) && Pkg.add("FileIO");
using Plots
using FileIO
# 使用FileIO读取WAV文件
file_path = "$(@__DIR__)/nina-brodskaja-zvenit-janvarskaja-vjuga.wav"
audio = FileIO.load(file_path)
# 解包返回的元组
audio_data, fs, num_channels, metadata = audio
# 0.01第二步
desired_step = 0.01 # 样品之间的时间(以秒为单位)
# 计算样本数0.01秒
desired_samples = round(Int, fs * desired_step) # 0.01秒的样本数
# 数据稀疏性:我们选择每个desired_samples值
downsampled_audio = audio_data[1:desired_samples:end]
# 重新计算稀疏数据的时间(以秒为单位)
t = (0:length(downsampled_audio)-1) * desired_step
# 归一化幅度
normalized_audio = abs.(downsampled_audio) ./ maximum(abs.(downsampled_audio))
# 1. 弱值的增强压缩(使用度<1)
function enhance_weak_values(data, exponent, min_val, max_val)
# 在从0到1的范围内对数据进行归一化
normalized_data = (data .- minimum(data)) ./ (maximum(data) - minimum(data))
# 我们使用指数<1的幂律压缩来增强弱值。
enhanced_data = normalized_data .^ exponent
# 缩放到从min_val到max_val的范围
compressed_data = min_val .+ enhanced_data .* (max_val - min_val)
return compressed_data
end
# 对弱值应用增强压缩(指数<1)
exponent = 0.2 # 值越低,弱值的放大越强。
compressed_audio = enhance_weak_values(abs.(downsampled_audio), exponent, 0, 1.0)
# ——————————————————————————————
# 2. 指数平滑以减缓亮度变化
function exponential_smoothing(data, alpha)
smoothed = [data[1]] # 我们从第一个值开始。
for i in 2:length(data)
push!(smoothed, alpha * data[i] + (1 - alpha) * smoothed[end])
end
return smoothed
end
# 我们应用指数平滑,平滑系数为0.1(我们减缓变化)
alpha = 0.2 # Alpha越低,变化越慢
exponentially_smoothed_audio = exponential_smoothing(compressed_audio, alpha)
normalized_audio = normalized_data = abs.(exponentially_smoothed_audio .- 0.2) ./ (maximum(exponentially_smoothed_audio) - minimum(exponentially_smoothed_audio) - 0.2)
# 绘制图形
gr()
plot(t, normalized_audio, title="归一化幅度", xlabel="时间", ylabel="的振幅", legend=false)
变量 t 和 normalized_audio 它们使用块加载到模型中 Табличная функция одной переменной 在子系统中 Звуковой сигнал. 将花环连接到KPM节奏并处理音频文件后,得到以下结果:
.gif)
工作的完整视频:
<iframe宽度="720"高度="405"src="https://rutube.ru/play/embed/881e4db1878b53e348dd41b519cbcd61"allow="clipboard-write;autoplay"webkitAllowFullScreen mozallowfullscreen allowFullScreen>
.png)