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