改进代码,使得频率轴对数化
时间: 2023-07-09 07:28:29 浏览: 121
可以使用MATLAB中的logspace函数来生成对数坐标轴上的频率刻度,然后在绘制语谱图时使用这些刻度。具体来说,可以在代码中加入以下两行代码:
```
f1 = logspace(log10(1), log10(fs/2), n/2+1); % 生成对数坐标轴上的频率刻度
set(gca, 'XTick', 0:0.5:(s/fs), 'XTickLabel', 0:0.5:(s/fs), 'YTick', f1); % 设置坐标轴刻度
```
第一行代码使用logspace函数生成从1Hz到fs/2(采样频率的一半)的n/2+1个对数坐标轴上的频率刻度,它的第一个参数是指定起始频率,第二个参数是指定终止频率,第三个参数是指定刻度数目。第二行代码使用set函数设置坐标轴的刻度,其中'XTick'表示X轴的刻度,'XTickLabel'表示X轴的刻度标签,'YTick'表示Y轴的刻度,0:0.5:(s/fs)表示坐标轴上的刻度位置,f1表示对应的刻度标签。下面是改进后的代码:
```
s = length(fx); % 信号长度
w = 256; % 窗长
n = w; % nfft,表示做fft变换需要的点数,一般为刚大于w的2的幂。举例,w=250,则n一般设为256
ov = w/2; % 分帧的交叉程度,常见设为窗长的二分之一或四分之一
h = w - ov; % 不重叠点数
win = hamming(n)'; % 选了常见的汉明窗,并设置nfft
c = 1; % 指向当前帧的指针
ncols = 1 + fix((s - n)/h); % 计算总共有多少帧
d = zeros((1+n/2), ncols); % 语谱图初始化
for b = 0:h:(s-n) % 以下处理各帧
u = win .* fx((b+1):(b+n)); % 各帧加窗
t = fft(u, n); % 各帧进行fft,内容为u,nfft=n。对于fft,输入n个时域点,输出n个频域点
d(:, c) = t(1:(1+n/2))'; % 并联频谱向量,注意只取1+n/2,因为负频率无意义,只留下0和正频率
c = c + 1; % 移动指针
end
tt = (0:h:(s-n))/fs; % 时间轴
f1 = logspace(log10(1), log10(fs/2), n/2+1); % 生成对数坐标轴上的频率刻度
imagesc(tt, f1, 20*log10(abs(d))); % 绘制
set(gca, 'XTick', 0:0.5:(s/fs), 'XTickLabel', 0:0.5:(s/fs), 'YTick', f1); % 设置坐标轴刻度
colormap(hot);
axis xy;
xlabel('时间/s');
ylabel('频率/Hz');
```
在这个改进后的代码中,语谱图的y轴已经被设置为对数坐标轴。
阅读全文