timeLength = 0.1; % 采样时长,单位秒 samples = timeLength * 44100; % 默认采样率44100,计算采样点数 H = audioDeviceReader(... 'NumChannels', 1,... % 1个通道 'SamplesPerFrame', samples); % 采样点数 audioIn = H(); % 第一次采样 figure('Name','实时频谱','MenuBar'... ,'none','ToolBar','none','NumberTitle','off'); xdata=(1:1:samples/2)/timeLength; axes1= subplot(1,2,1); axes2= subplot(1,2,2); pic= plot(axes1, 1:1:samples, audioIn); % 初始化音频波形图 pic2= bar(axes2,xdata, xdata*0,'r'); % 初始化频谱图 set(axes1,'xlim', [0 samples], 'ylim', ... [-0.15 0.15],'XTick',[],'YTick',[] ); set(axes2,'xlim', [min(xdata) max(xdata)], 'ylim',[0 6] , ... 'xscale','log','XTick',[1 10 100 1e3 1e4],'YTick',[] ); xlabel(axes2,'频率 (Hz)'); xlabel(axes1,'波形'); axes2.Position=[0.040 0.48 00.92 0.48]; % 左,下,宽度,高度 axes1.Position=[0.040 0.06 0.92 0.25]; drawnow; while 3>2 [audioIn,Overrun] = step(H); % 采样 if Overrun > 0 warning(' 数据溢出 %d 位\n',Overrun); end ydata_fft=fft(audioIn); % 傅里叶变换 ydata_abs=abs(ydata_fft(1:samples/2));% 取绝对值 set(pic, 'ydata',audioIn); % 更新波形图数据 set(pic2, 'ydata',log(ydata_abs)); % 更新频谱图数据 drawnow; % 刷新 end
时间: 2024-01-08 12:02:04 浏览: 76
这段代码是用于实时绘制音频信号的波形图和频谱图。首先定义了采样时长和采样点数,然后通过audioDeviceReader对象来读取音频输入。接下来创建了一个图形窗口,分为两个子图,一个用于显示音频波形图,一个用于显示频谱图。初始化了波形图和频谱图的数据,并设置了它们的坐标轴范围和刻度。然后进入一个无限循环,不断采样音频信号并进行傅里叶变换,更新波形图和频谱图的数据,并刷新显示。
注意:此处代码只是一个示例,具体使用时可能需要根据实际情况进行适当修改。
相关问题
timeLength=0.1; % 采样时长,单位秒 samples=timeLength*44100; % 默认采样率44100,计算采样点数 H = dsp.AudioRecorder(... 'NumChannels' , 1 ,... % 1 个通道 'DeviceDataType', '16-bit integer',... % 16位采样 'OutputNumOverrunSamples',true,... % 启用溢出标志 'SamplesPerFrame', samples); % 采样点数 [audioIn,~] = step(H); % 第一次采样 修改该段代码为matlab2021b 版本适用
timeLength=0.1; % 采样时长,单位秒
samples=timeLength*44100; % 默认采样率44100,计算采样点数
H = audioDeviceReader(...
'NumChannels' , 1 ,... % 1 个通道
'DeviceDataType', '16-bit integer',... % 16位采样
'OutputNumOverrunSamples',true,... % 启用溢出标志
'SamplesPerFrame', samples); % 采样点数
[audioIn,~] = H(); % 第一次采样
timeLength=0.1; % 采样时长,单位秒 fs = 8000; N = 8192; samples=timeLength*fs; % 默认采样率fs,计算采样点 H = audioDeviceReader(... 'NumChannels' , 1 ,... % 1 个通道 'SamplesPerFrame', samples); % 采样点数 [audioIn,~] = step(H); % 第一次采样 figure('Name','实时频谱','MenuBar'... ,'none','ToolBar','none','NumberTitle','off'); drawnow; while 3>2 [audioIn,Overrun] = step(H); % 采样 if Overrun > 0 warning(' 数据溢出 %d 位\n',Overrun); end subplot(121); plot(1:1:samples, audioIn); spectr_audio = fft(audioIn, N); f = 0: 1: N-1; subplot(122); plot(f, log(abs(spectr_audio))); drawnow; % 刷新 end
这段代码是用于实时采集音频数据并显示频谱的。首先,设置了采样时长为0.1秒,采样率为8000Hz,采样点数为8192。然后,创建了一个音频设备读取器对象`audioDeviceReader`,设置通道数为1,采样点数为计算得到的采样点数。接着,通过`step`方法进行第一次采样,并将采样结果保存在`audioIn`变量中。然后,创建了一个图形窗口用于显示实时频谱。进入无限循环,每次循环中通过`step`方法进行采样,并检查是否发生数据溢出。然后,绘制音频波形图和频谱图,并通过`drawnow`方法刷新图形窗口。循环会一直执行下去,直到手动中断程序。
需要注意的是,这段代码中的循环没有退出条件,可能会导致程序无法正常结束。你可以根据实际需求添加适当的退出条件。另外,频谱的绘制使用了对数尺度,可以更好地展示频谱的动态范围。
阅读全文