Октава проблема с построением только некоторых образцов аудиосигнала - PullRequest
0 голосов
/ 12 декабря 2018

Моя задача - загрузить сигнал, затем взять каждый 8-й сэмпл и сравнить его с 0.

Если сэмпл> 0 -> сэмпл = 1 еще сэмпл -> 0.

Iесть код, подобный следующему:

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 - это значение 1 или 0. Я хочу, чтобы они оставались в этих индексах и игнорировали другие, когда я вызываю plot (z).

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Для каждой точки у вас есть две координаты: значение данных

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

0 голосов
/ 12 декабря 2018

Не используйте для циклов, это легко векторизовать:

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