2016-03-16 3 views
1

я генерации синусоидальной волны с использованием следующего метода -синусоидальной волны генерации с использованием фазы

sampling rate = 22050; 
theta = 0; 

for (i = 0; i < N; i++) 
{ 
theta = phase * 2 * PI; 
signal[i] = amplitude * sin(theta); 
phase = phase + frequency/sampling rate; 
} 

Когда я генерировать сигнал с частотой 8000 Гц, есть искажение на выходе. Частоты ниже этого (например, 6000 Гц) генерируются правильно. Гц сигнал 8000 генерируется правильно, если я помещаю чек на фазе, как так -

if (phase > 1) 
{ 
    float temp = phase - 1; 
    phase = temp; 
} 

Я думаю, что это что-то делать с синусоидальной функцией в Xcode, вероятно, диапазон значений может принимать? Тот же код с фазовой упаковкой и без нее не имеет разницы в Matlab. Может кто-нибудь объяснить, что здесь происходит?

+0

Если вас интересует XCode, вам нужно сообщить нам, какие типы имеют разные переменные. Это может показаться чем-то. Как бы то ни было, я могу видеть только тип «temp». –

+0

Hi Peter, PI объявлен как двойной, а theta in float. Я изменил theta на double, и код генерирует сигнал 8K без искажений. Благодаря! – Naveen

+0

Приятно слышать. Я собираюсь закрыть этот вопрос как не относящийся к теме, и перенести его в SO. –

ответ

0

Я считаю, что расчет должен быть (2,0 * PI) * Частота/оцифровки

Это даст вам следующее приращение фазы в радианах. это значение затем может быть подано в функцию Sin для вычисления фазы. Обратите внимание, что вам необходимо скопировать значения радиан.

Технически ваше первое утверждение неверно, поскольку оно сформулировано. FS/2 - значение nyquist. Вы можете производить частоты выше этого, но они будут псевдонимом.

С точки зрения фазовой обертки существуют различные способы управления этим.

Мое понимание радианов заключается в том, что это «линейное» представление фазы, которое не повторяется, а фаза вращается вокруг значений 2 pi. Поэтому у вас может не возникнуть проблема с оберткой, если вы управляете фазой, управляя радианами.

Счастливый, исправленный более осведомленными людьми.

0

Я не уверен, но я считаю, что проблема может быть:

theta = phase * 2 * PI; 

Я думаю, что Xcode изменит результат до целого числа. Вы могли бы хотеть попробовать:

theta = phase * 2.0 * PI; 

вместо этого, и убедитесь, что ваш PI переменная является double.

Все это делает это вне темы для DSP.SE. :-)

0

@cixelsyd имеет правильную формулу ... вот код для создания набора образцов заданной частоты, основываясь на частоте дискретизации

incr_theta := (2.0 * math.Pi * given_freq)/samples_per_second 

phase := -1.74 // given phase ... typically 0 note its a constant 
theta := 0.0 

for curr_sample := 0; curr_sample < number_of_samples; curr_sample++ { 

    source_buffer[curr_sample] = math.Sin(theta + phase) 

    theta += incr_theta 
} 

для повышения эффективности его лучше перемещать расчет delta theta вне цикла ... фаза уведомления является постоянной, поскольку она просто дает нам начальное смещение

Смежные вопросы