matlab数字音效处理器 本人自行编写的音频处理软件,有GUI,音频处理,时频域分析,加噪,滤波去噪,变声,混音,均衡,可直接运行的工程 有关键性注释和文件说明,但也只适合想直接用或者有一定基础的朋友分析学习

熬夜剪城市漫游vlog那段深夜地下车库电梯素材真是破防:剪映拉满智能降噪人声糊成焖罐,降噪留声的还要花19.9开周卡甜酷插件;想给地下车库那段弹吉他加个空旷车库混响,免费预设调出来要么像澡堂要么像太空舱;更气的是想实时看滤波前后的波形频谱对比,免费软件还要切来切去保存。一气之下掏出去年攒的DSP课Matlab半吊子代码,吭哧吭哧补了一周搭出了这个有模有样带实时交互GUI的小玩意儿


先丢个大概:工程怎么跑怎么看

直接从文件包里找「DSPProcessorUI.m」点运行就行!Readme那个txt真不是凑字数的垃圾——有模块按钮对应的快捷键、采样率尽量统一成44100/48000Hz的警告、Functions文件夹里每个子函数做了啥(带踩过的随手注)。小白纯玩:按提示录一段或者拖个WAV就行,别碰Functions;有点Matlab基础想抠细节:Functions里的注释是“上课怕忘标红”+“上周搭的时候变量写错的地方注释留痕防再犯”的混合体,肯定比晦涩的函数文档亲切。


掏点干货,说几个我觉得最好玩/最实用的模块,带小碎代码

1. 滤波去噪模块(剪vlog救大命的核心)

当时踩的最大坑就是巴特沃斯滤波器阶数设高了会“ ringing(振铃效应)”——比如地下车库那段本来偶尔有个尖锐刹车声,二阶还行,六阶以上刹车声消了,电梯门开关的边缘直接变锯齿滋滋的。

后来选了FIR汉宁窗低通+高通自适应?不对没那么高级,是加了个「阶数滑块」「截止频率滑块」「滤波器类型下拉」,还给实时对比的波形频谱加了个汉宁窗分窗显示。

随便截一段选滤波器阶数的核心代码:

% 下拉菜单选滤波器类型,先存临时变量方便后面切汉宁窗
global filter_type tmp_order tmp_cutoff;
filter_type = get(handles.filter_type_popup, 'Value');
tmp_order = round(get(handles.order_slider, 'Value')); % 滑块是浮点数,得取整,别问为什么取整忘标就会报错FFT不对
tmp_cutoff = get(handles.cutoff_slider, 'Value');

% 如果选的是FIR汉宁,阶数直接给用户设,选巴特沃斯自动限制在1-4(踩坑无数的血泪教训!)
if filter_type == 1 
    b = fir1(tmp_order, tmp_cutoff/(get(handles.Fs_text, 'String')/2), 'low');
else
    tmp_order = min(4, max(1, tmp_order)); % clamp函数找不到?Matlab2016b之后才有,自己写个max min嵌套得了
    [b, a] = butter(tmp_order, tmp_cutoff/(get(handles.Fs_text, 'String')/2), 'low');
end

这段代码注释里的血泪教训是真的!一开始没给巴特沃斯加clamp,有人手滑把阶数拉到20,滤波后的声音卡成PPT翻页,差点以为是电脑炸了。实时分窗对比更有意思:我把音频切成2048点一帧,汉宁窗叠50%,FFT后画成热图对比——滋滋底噪在热图上就是横条,尖锐刹车声是竖条,调滑块的时候横条竖条消得很直观,再也不用瞎蒙。

2. 变声模块(甜酷搞怪全靠它,剪片尾彩蛋绝了)

一开始做变声只想到「变速不变调」和「变调不变速」,后来上课突然想到以前玩过的变声器加机器人效果,就加了个「机器人延迟」滑块。

matlab数字音效处理器 本人自行编写的音频处理软件,有GUI,音频处理,时频域分析,加噪,滤波去噪,变声,混音,均衡,可直接运行的工程 有关键性注释和文件说明,但也只适合想直接用或者有一定基础的朋友分析学习

变速不变调用的是Matlab自带的resample+phasevocoder?不对自带的phasevocoder好像在Audio Toolbox里?怕有些朋友没装工具箱,自己用STFT和ISTFT凑了个简易相位声码器,凑的时候把相位谱的连续性给丢了一丢丢,不过声音完全能用,搞怪效果还更强了(偶尔会有一点点电流滋滋的搞怪尾音)。

简易变调不变速(机器人效果是后来加的,这里先放变调核心)的小碎代码:

function y = simple_pitch_shift(x, Fs, semitones)
    % semitones是升降调数,比如升2就是甜妹变御姐预备役?
    win_len = 2048;
    hop_in = win_len / 4; % 叠75%的汉宁窗,保连续性丢得少
    hop_out = hop_in * 2^(-semitones/12); % 核心公式!升降调数和跳帧数的关系
    n_frames = floor((length(x) - win_len)/hop_in) + 1;
    
    % 预分配内存,不然慢死你(上次没预分配录了个30s的歌卡了5分钟)
    X = zeros(win_len, n_frames);
    Y = zeros(win_len, n_frames);
    y = zeros(1, round(length(x)*2^(-semitones/12)) + win_len);
    
    for i = 1:n_frames
        start = (i-1)*hop_in + 1;
        X(:,i) = x(start:start+win_len-1) .* hanning(win_len); % 汉宁窗叠叠乐
        Y(:,i) = abs(fft(X(:,i))); % 只取幅度谱!相位谱随便重置?不不还是按相邻帧的跳帧数补一点吧
        % 补相位的简易方法(课上听的皮毛,能用就行)
        if i == 1
            phi = angle(fft(X(:,i)));
        else
            phi = phi + 2*pi*hop_out*(0:win_len-1)/win_len;
        end
        Y(:,i) = Y(:,i) .* exp(1j*phi);
        y_out_frame = real(ifft(Y(:,i))) .* hanning(win_len);
        % 把输出帧叠回去
        start_out = round((i-1)*hop_out) + 1;
        y(start_out:start_out+win_len-1) = y(start_out:start_out+win_len-1) + y_out_frame;
    end
    y = y / max(abs(y)); % 归一化,不然声音会爆
end

这段代码里的预分配内存也是血泪教训!30s的歌没预分配卡5分钟,预分配后2秒搞定。机器人效果更简单:加个延迟滑块(比如0-50ms),把变调后的声音和延迟后的声音叠加,幅度各占50%,瞬间就有那种冷冰冰的地下车库机器人保安的感觉了,剪片尾彩蛋配上弹吉他搞怪视频绝了。


剩下的模块随便提提,都很实用

  • 时频域分析模块:除了刚才滤波去噪的实时对比,还有静态的波形图、频谱图、语谱图(热图),语谱图可以自己调对比度和颜色映射(默认是jet,我偷偷加了viridis,对眼睛友好点)。
  • 加噪模块:可以加高斯白噪声、粉红噪声、椒盐噪声,椒盐噪声加在弹吉他的视频里像下雨时雨滴打吉他弦的声音,挺好玩的。
  • 混音模块:可以拖两个WAV进去,调两个的音量比例,还可以加淡入淡出效果(淡入淡出的时间可以自己设,默认是1秒)。
  • 均衡器模块:是个10段图形均衡器,滑块可以自己拉,还有预设的流行、摇滚、古典、爵士模式(预设是我随便调的,别当真,不过流行模式还挺好用的,提升了一点低音和高音)。

最后说两句

这个小玩意儿肯定比不上专业的音频处理软件(比如Audition、Logic Pro),但胜在免费、小巧、带实时交互GUI、有注释适合半吊子抠细节。小白纯玩剪个小vlog片尾彩蛋肯定够用,半吊子抠抠Functions里的代码还能学到一点STFT/ISTFT、滤波器、相位声码器的皮毛。

如果有什么bug或者想加的功能(比如AI降噪?不过AI降噪要工具箱还要模型,我暂时搞不定),可以在评论区留言,我有空会补的!

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐