找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3051|回复: 0
打印 上一主题 下一主题
收起左侧

MATLAB程序设计(FFT算法、回声产生、MATLAB录音)

[复制链接]
跳转到指定楼层
楼主
ID:432932 发表于 2019-7-12 15:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
FFT算法坐标轴优化:
对于MATLAB离散处理信号频域分析,我们一般会使用FFT,及快速傅里叶算法来实现,但是实际使用时需要对
坐标轴以及幅值进行调整,以使绘出的频谱图更具有直观性,下面给出个人习惯用的代码如下:
function [  ] = fftplot(hObject, eventdata, handles,h, x, Fs )
% x :输入信 h:所绘制的画板句柄  Fs:采样频率
L = length(x);
NFFT = 2^nextpow2(L);               %确定FFT变换的长度
y = fft(x, NFFT)/L;
f = Fs/2*linspace(0,1,NFFT/2+1);    %频率向量
axes(h);   %指定画板
plot(f, 2*abs(y(1:NFFT/2+1)));      %绘制频域图像
grid on;
title(频谱图');
xlabel('Frequency (Hz)');
ylabel('|y(f)|');
由于这个是个人在GUI中使用的,因此有hObject, eventdata, handles这三个参数,具体GUI使用可以看附件
NFFT = 2^nextpow2(L);   这一步就是将FFT点数调整至2的幂次方,来基2算法来加快FFT速度
y = fft(x, NFFT)/L;除以L是为了调整幅值,使其与实际幅值一致



接下来是回声的产生,分单回声和多回声:
单回声代码如下:
y    =  handles.y;
Fs   =  handles.Fs;
s = round(get(handles. slider17,'value')*length(y));
set(handles.text37,'string',num2str(s));
a= get(handles. slider18,'value');
Bz=[1,zeros(1,s),a];
Az=1;
y1=filter(Bz,Az,[y;zeros(length(y),1)]);
axes(handles.axes3);
plot(y1,'linewidth',2);
grid on;
h = handles.axes4;
fftplot( hObject, eventdata, handles,h,y1, Fs);
y是音频数据,Fs为采样频率,使用load 函数加载一个音频即可得到
s 是回声延时系数
a 是衰减系数
Bz=[1,zeros(1,s),a];
Az=1;
y1=filter(Bz,Az,[y;zeros(length(y),1)]);
y1 即为叠加了单回声的音频
sound(m*y1,n*Fs)即可播放,m为音量控制系数,n为播放速度控制系数
下面是多回声的:
function pushbutton17_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton17 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
fs   =  handles.Fs;  %多回声
y    =  handles.y;
N =   handles.chong;
s = round(0.2*length(y));
a= 0.5;
Bz=[1,zeros(1,s)*N,a^N];
Az=[1,zeros(1,s),a];
y1=filter(Bz,Az,[y;zeros(2*length(y),1)]);
axes(handles.axes3);
plot(y1,'linewidth',2);
grid on;
sound(y1,fs);
guidata(hObject,handles);
N为多回声的重数


最后面给出使用MATLAB录音的一段GUI程序:
function pushbutton13_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton13 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
num = [8000, 11025, 22050,44100];
value = get(handles.popupmenu3,'value');
Fs = num(value);
handles.rFs = Fs;
handles.R = audiorecorder(Fs,  handles.bits , handles.channel) ;
record(handles.R);
guidata(hObject,handles);

function pushbutton14_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton14 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
stop(handles.R);
%play(handles.R);
%audiowrite('myaudio.wav');
guidata(hObject,handles);

function pushbutton15_Callback(hObject, eventdata, handles)
      handles.y= getaudiodata(handles.R);
      handles.Fs =handles.rFs;
y    =  handles.y;
   Fs   =  handles.Fs;
     sound(a*y,v*Fs);

简单来说,就是用audiorecorder和record开始录音,stop停止录音
但是网上大部分资料显示可以使用PLAY 函数来播放音频,但是可能是由于个人MATLAB不够给力的
原因,用play只有电流声音,于是改用getaudiodata和sound来播放,效果还不错


以上的部分都只是个人做的一个关于数字信号处理课程设计的部分内容,还做了一点关于音频均衡器和滤波方面的内容
有兴趣的话可以下载附件来看看,嘻嘻
小弟我才疏学浅,还望各位大佬们多多包涵。



数字信号处理课设.doc

1.4 MB, 下载次数: 24, 下载积分: 黑币 -5

附带程序源码

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表