Создание синусоидальной волны в Matlab - PullRequest
0 голосов
/ 24 октября 2018

Я хочу создать синусоидальную волну, которая имеет следующие свойства:

  • синусоида с f = 400 Гц = 1 от 0 до 2 с

  • синусоида с f = 200 Гц amp = 1 от 2 до 3 с

  • синусоида с f = 800 Гц amp = 2 от 3 до 5 с

Вот мой код Matlab:

t=linspace(0,5,5000);
x=zeros(1,length(t));
n1=0:1999;
n2=2000:2999;
n3=3000:4999;
x(1:2000)=1*sin(2*pi*400*n1);
x(2001:3000)=1*sin(2*pi*200*n2);
x(3001:5000)=2*sin(2*pi*800*n3);
plot(t,x)

, и вот график, который у меня был, все равно он выглядит нелогичным, поэтому я хотел бы знать об ошибке в моем коде

enter image description here

1 Ответ

0 голосов
/ 24 октября 2018

В этом типе проблемы, когда вы естественным образом смотрите на физические величины, очень полезно быть последовательным с этим во всех ваших вычислениях.

В частности, вы указываете Гц (1 / секунды)это физическая единица, поэтому, когда вы вычисляете все остальное, вам нужно соответствовать этому.

Чтобы сделать это в вашем уравнении, проще всего поместить время непосредственно в функцию sin, например sin(2*pi*f*t).Но так как вы хотите разбить массив на части, используя разные n, вероятно, проще всего это сделать, а затем использовать t=linspace(0,5,50000) и dt = 5.0/50000 или dt = t(2) - t(1) и sin(2*pi*400*dt*n1).Прочитайте это, как dt*n1 преобразует целые числа в n1 во время в секундах.

Обратите внимание также и на физические единицы: 400 в приведенном выше фактически 400Hz, а время в секундах, поэтомуединицы измерения 2*pi*400*dt*n1 и 2*pi*f*t равны Hz * s = 1, то есть единицы отменяются, и это то, что вам нужно.

У программистов существует тенденция определять некоторые единицы, например, сказать seconds=1.Это возможно и технически правильно и может сохранить умножение или два.Это почти всегда приводит к ошибкам.

Обратите внимание, что вы должны перейти с t=linspace(0,5,5000) на что-то вроде t=linspace(0,5,50000).Причина теперь должна быть ясна: вы смотрите на частоты от 400 до 800 Гц, или почти 1kHz, или 1 колебание в миллисекунду.Чтобы увидеть синусоидальную волну, вам нужно ввести несколько точек данных на одно колебание, и 50000 точек за 5 секунд теперь дадут около 10 точек за миллисекунду, что едва достаточно, чтобы увидеть разумную синусоидальную волну.Или, как бы вы ни думали о расчете, вам нужно как-то убедиться, что вы производите выборку с достаточно высокой скоростью.

То есть конкретная ошибка, с которой вы сталкиваетесь, - использование целых чисел вместо дробейво-вторых, для вашего временного массива вы делаете слишком большие шаги для функции sin.Это всегда возможные проблемы с функцией sin, но даже если бы вы нарисовали sin, который выглядел как sin (скажем, с использованием частоты, такой как 0,003 Гц вместо 400 Гц), она все равно была бы неправильной, потому что онане будет правильной оси времени.Таким образом, вам нужно правильно настроить единицы измерения и убедиться, что вы получаете достаточно данных для каждого колебания, чтобы увидеть синусоидальную волну (или то, что вы ищете).

...