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

Octave problem with ploting only some samples of audiosignal

我的任务是加载一个信号,然后每 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

我的问题是,如果我 select 每 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) 时忽略其他索引。

不要使用 for 循环,向量化很容易:

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

对于每个点你有两个坐标,数据的值

z = sn(1 : 1 : end);

和数据的位置

p=1 : 1 : 100;

所以你的 plot(z) 等同于 plot(p,z)。
当你 reduce/decimate 你需要同时维护两个坐标的样本时

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