仅绘制一些音频信号样本的八度音阶问题

时间:2018-12-12 10:59:24

标签: plot signals octave selection

我的任务是加载一个信号,然后每隔8个样本进行采样并将其与0进行比较。

如果样本> 0->样本= 1,否则样本-> 0。

我有这样的代码:

sn = wavread('example.wav',100);
z = sn(1 : 1 : end);
x = sn(1 : 1 : end);
for i = 1:rows(z);
  for j = 1:columns(z);
    if(z(i,j) < 0);
      z(i,j) = 0;
    else
    z(i,j) = 1;
    endif
  endfor
endfor
plot(x, "*",z, "o");

Result1

我的问题是,如果我像这样选择每8个样本:

z = sn(1 : 8 : end);

它仅保留第8个样本,结果是这样的:

Result2

我需要保留100个样本并仅每8个打印一次,以保持第一张图片的比例。

谢谢你的建议。

编辑:我用过

idx = 1:8:numel(z);
z(idx) = z(idx) > 0;

现在看起来像这样:

result3

是否有任何方法只能打印出值为1或0的样本并强制其保留在其原始索引上?例如,在索引1,9,17,25,33上是val 1或0。当我调用plot(z)时,我希望它们保留在那些索引上并忽略其他索引。

2 个答案:

答案 0 :(得分:2)

对于每个点,您都有两个坐标,即数据值

z = sn(1 : 1 : end);

和数据位置

p=1 : 1 : 100;

所以您的图(z)相当于图(p,z)。
减少/减少样本时,您需要同时保留两个坐标

zd=z(1:8:end);
pd=p(1:8:end);
plot(pd,zd,"+")

例如

p=1:1:100;
z=sin(p*pi()/50);
subplot(1,2,1)
plot(p,z,"+")
pd=p(1:8:end);
zd=z(1:8:end);
subplot(1,2,2)
plot(pd,zd,"*")
print -djpg figure1.jpg

full data and decimate one

答案 1 :(得分:0)

不用于循环,很容易将其向量化:

z = rand (100, 1);
idx = 1:8:numel(z);
z(idx) = z(idx) > 0;