clc;clear;close all; clear all; fs = 8000; [y,fs] = audioread("qingtian.wav"); sigPlayer = audioplayer(y(:,1),fs); myFigure = figure('Name','标题'); waveAxes = subplot(2,1,1); axis(waveAxes,[-inf inf -1 1]); waveAxes.NextPlot = 'replacechildren'; fftAxes = subplot(2,1,2); axis(fftAxes,[-inf inf 0 0.5]); fftAxes.NextPlot = 'replacechildren'; windLength = fs/20; sigPlayer.TimerPeriod = windLength/fs; sigPlayer.TimerFcn = {@fleshPlot,waveAxes,fftAxes,y(:,1),fs,windLength}; play(sigPlayer); while 3>2 [audioIn,Overrun] = step(sigPlayer); ydata_fft=fft(audioIn); ydata_abs=abs(ydata_fft(1:samples/2)); set(pic, 'ydata',audioIn); set(pic2, 'ydata',log(ydata_abs)); drawnow; end function fleshPlot(plr,~,axwave,axfft,sigData,fs,winL) persistent ind; persistent indbase; persistent wavePlot; persistent fftPlot; if isempty(indbase) indbase = 1:winL; end ind = fix((plr.CurrentSample)/winL)*winL+indbase; segData = sigData(ind); wavePlot = plot(axwave,segData); [absFFT,fqax] = fftc2(segData,fs); fftPlot = bar(axfft,fqax,absFFT); end function [X,freqRange]=fftc2(x,fs) N=length(x); X=abs(fft(x))/N; rawRange = 0:fix(N/2); freqRange = (rawRange)*fs/N; LfftInd = rawRange + 1; X = X(LfftInd); X(2:end) = 2*X(2:end); end
时间: 2024-04-19 18:27:58 浏览: 92
ga_main_gamain_tic函数_遗传算法源码_AllClear_
这段代码是用来读取并播放音频文件 "qingtian.wav",同时实时绘制音频波形图和频谱图。首先,通过调用`audioread`函数读取音频文件,然后创建一个`audioplayer`对象并设置播放参数。接下来,创建一个图形窗口,并在窗口中创建两个子图来显示波形图和频谱图。然后,设置音频播放器的定时器回调函数,该回调函数会在每个时间窗口中更新波形图和频谱图的数据,并通过调用`play`函数开始播放音频。最后,使用循环不断获取音频数据并更新图像。
`fleshPlot`函数用于更新波形图和频谱图的数据。它使用持久变量来保存一些状态信息,如当前音频样本的索引和绘制的曲线对象。在每个时间窗口中,它从输入音频数据中提取一段数据,并使用`plot`和`bar`函数将数据更新到波形图和频谱图中。
`fftc2`函数用于计算离散傅立叶变换,并返回频谱幅值和对应的频率范围。
请注意,这段代码可能存在一些错误或不完整的地方,例如未定义变量`samples`和`pic`,在使用之前应该先定义它们。另外,循环`while 3>2`可能是一个无限循环,你可能需要添加一个停止循环的条件。
阅读全文