爱收集资源网

代码逻辑不清晰,让你小白也能看懂

网络整理 2023-10-28 05:02

@数字讯号处理大作业——基于matlabR2019a的男声变女声资料汇总与代码

概述

参考了好多前人的资料,发觉好多函数早已过时了,但是从我通过VIP下载的代码来看,代码的逻辑不是很清晰,屁话也多,注释也写的不清楚(也可能也是我太小白了看不懂哈哈哈哈哈)写博客的初心是对自己这一天做的工作给个总结,便捷之后的人,自己也觉得十分开心,嘿嘿!

瞧瞧我的文件夹

诸位小青菜注意,matlab的代码和其他相关文件一定要整整齐齐的放好,否则之后有你的苦吃,嘿嘿嘿;我也是小白嘿嘿,你们要相互学习鸭;第一次写博客,排版丑希望多提建议,小朱给你们作揖!

算法原理

查到了几种,以下为小笔记本记录的:

对语音的取样率进行变化,才能改变声音。例如取样率高于奈奎斯特定律中的2fh,都会遗失高频份量,声音音质自然会变化。并且这些会遗失信息,但是不易用参数控制;可以通过改变播放的速率实现,快5%就是女声,慢5%就是男声。记得多普勒效应吗?一辆响着警笛声的车,朝你来时声音尖,离你远逝时声音闷声音识别算法源代码,大约有点这意思。并且似乎,我们不希望输入输出的声音速率发生变化,这样用户体验也太差了;所以男女声变音必须是进行频谱搬动。学过通电/讯号与系统的同志们都晓得,正弦函数乘个正弦函数,积化和差,会有和频差频份量生成,频谱发生了搬动,这些变化称为“调制”。所以我们可以通过这些方式实现吗?不行。通电里可以,是由于两个相加量的频度大小相差甚远,生成的讯号可以便捷的滤下来。男声女声距离很近,频带又宽,所以用模拟的方式无法实现。哈哈哈所以这时侯就彰显了数字讯号处理的优越性,尽管目前我做的疗效也不大好,但我相信我能做的更好,然后会更新的!有些代码用cirshift进行搬动,可它就是个让频谱在固定范围绕圈的函数,我真不明白用它有何用。所以我最后选择频域乘exp(jwt),可疗效也不好声音识别算法源代码,我不明白为什么。这大约就是理想与现实的差别,说明理论落地很难。try1.m

clc
[y1,Fs] = audioread('source.wav');  %读出信号,采样率和采样位数。 %注意文件格式要求
%source为男声音频
%sound(y1,Fs);  %播放文件
%设计巴特沃斯低通滤波器  此处加滤波器会使声音变模糊,似乎很重要的高频分量被丢掉了
%Wc1=2*1000/Fs;                                          %男声截止频率 1000Hz
%[b,a]=butter(4,Wc1);
%y1=filter(b,a,y1);
Y1 = fft(y1);%Fast Fourier transform
sigLength=length(y1);%Length of largest array dimension
f=Fs*(1:sigLength)/sigLength;
absY=abs(Y1);%Absolute value and complex magnitude
figure('Name','Measured Data','NumberTitle','off');
%Create figure window
%Specify the Name property again, but this time, set the NumberTitle property to 'off'. 
%The resulting title does not include the figure number.
%绘制男声频域
subplot(2,2,1);plot(f,absY);xlabel('Frequency(Hz)男声频域');grid on
%绘制男声时域
t=(0:sigLength-1)/Fs;%t = 1 / f
subplot(2,2,2);plot(t,y1);xlabel('Time(s)男声时域');grid on
%频谱搬移(时域相移,频域调制)
Y2 = fft(y1 .* exp(1000/(2 * pi) * 1i .* t'));
%绘制女声频域
absY2=abs(Y2);
subplot(2,2,3);plot(f,absY2);xlabel('Frequency(Hz)女声频域');grid on
%绘制女声时域
y2=ifft(Y2);
subplot(2,2,4);plot(t,y2);xlabel('Time(s)女声时域');grid on
y2=abs(y2);%audiowrite必须输入为实数
%失败的滤波器尝试
%BPF = load('LPF_60M.mat');
%y3 = filter(BPF.LPF_60M,1,y2);
%能调通但是效果不好的滤波器尝试
y3=highp(y2,400,500,0.0001,0.02,Fs);
audiowrite('transform30.wav',y3,Fs)
%transform30为生成的文件,它生成的地址不是很确定,会发生变化,
%我还没搞明白,以下是它出现的两个位置:
%C:\Users\honor\Documents\MATLAB\Examples\R2019a\matlab\WriteanAudioFileExample
%E:\\dsp_greatassignment\try
若不清楚可在电脑“开始”里搜一下具体在哪。

里面用到的highp函数,这段代码好多网页上都有,我是从复制粘贴过来并作了一些改动。

function y=highp(x,f1,f2,rp,rs,Fs)
%高通滤波,该代码鲁棒性很差,试试你就晓得了
%也可能是我不会用
%通带或阻带的截止频率的选取范围是不能超过采样率的一半
%即,f1,f3的值都要小于 Fs/2
%x:需要带通滤波的序列
% f 1:通带截止频率
% f 2:阻带截止频率
%rp:边带区衰减DB数设置
%rs:截止区衰减DB数设置
%FS:序列x的采样频率
wp=2*pi*f1/Fs;
ws=2*pi*f2/Fs;
% 设计切比雪夫滤波器;
[n,wn]=cheb1ord(wp/pi,ws/pi,rp,rs);
[bz1,az1]=cheby1(n,rp,wp/pi,'high');
%查看设计滤波器的曲线
[h,w]=freqz(bz1,az1,256,Fs);
h=20*log10(abs(h));
figure('Name','highpass filter','NumberTitle','off');
plot(w,h);title('所设计滤波器的通带曲线');grid on;
y=filter(bz1,az1,x);
end

%失败的检波器尝试使用了通过VIP下载的代码(就是参考代码里的‘filter’),并且不知为什么调不通。在MATLAB命令行窗口键入fdatool即可弹出设计混频器的窗口,并且设计完直接保存后生成的是.fda文件,无法直接用,得弄成.mat文件;.mat文件也无法直接用,得在编辑器使用“load(‘BPF_130M.mat’)”或者在文件夹双击它。而且,可能我导入为mat文件的参数没选对,看着和参考代码‘filter’一样,就是调不通。好惨~~

资料

音频识别算法_声音识别算法源代码_声音识别程序

以下为艰辛坎坷探求过程东路过的有帮助的网页。

打开.mat文件

fdatool和FIRMegaCore使用方法的问题

七种混频方式

%257B%2522request%255Fid%2522%253A%2522160343803219724838551089%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=160343803219724838551089&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v28-1-82082543.first_rank_ecpm_v3_pc_rank_v2&utm_term=%E9%AB%98%E9%80%9A%E6%BB%A4%E6%B3%A2%E5%99%A8matlab&spm=1018.2118.3001.4187

混频器资料

fda文件

filter

混频

声音识别算法源代码
上一篇:终结进程无效?解决方法在这里 下一篇:没有了