В этом типе проблемы, когда вы естественным образом смотрите на физические величины, очень полезно быть последовательным с этим во всех ваших вычислениях.
В частности, вы указываете Гц (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 Гц), она все равно была бы неправильной, потому что онане будет правильной оси времени.Таким образом, вам нужно правильно настроить единицы измерения и убедиться, что вы получаете достаточно данных для каждого колебания, чтобы увидеть синусоидальную волну (или то, что вы ищете).