2012-03-14 1 views
2

Я использую функцию sound() в MATLAB для генерации тона. Эта функция играет тон в течение 4 секунд при 440Hz:MATLAB: audioplayer()

duration = 4 
toneFreq = 440 
samplesPerSecond = 44100; % the bit rate of the tone 
y = sin(linspace(0, duration * toneFreq * 2 * pi, round(duration * samplesPerSecond))); % the equation of the sound wave 
sound(y, samplesPerSecond); % play the sound wave at the specified bit rate 

Иногда (после использования функции несколько раз), я получаю сообщение об ошибке от MATLAB, говоря «не может зарегистрировать звук окна». Немного осмотрев интернет, я заметил, что это известная ошибка в MATLAB (версия R14 SP3), и поэтому общий совет, похоже, заключается в использовании 'audioplayer' function. Таким образом, я обновил свой код до следующего:

duration = 4 
toneFreq = 440 
samplesPerSecond = 44100; % the bit rate of the tone 
y = sin(linspace(0, duration * toneFreq * 2 * pi, round(duration * samplesPerSecond))); % the equation of the sound wave 
player = audioplayer(y, samplesPerSecond); % play the sound wave at the specified bit rate 
play(player) 

Однако это не вызывает тональности. Может ли кто-нибудь помочь в создании этого нового кода?

+0

Ваш новый код работает для меня. Поскольку ваш старый код работал некоторое время, и они остановились, это может быть что-то связанное с Java или аудио-драйвером, я не уверен. Вы пытались перезапустить MATLAB или компьютер? – yuk

+0

Старый код работает, но иногда он терпит неудачу и выдает сообщение об ошибке. Затем мне нужно перезапустить MATLAB :( – CaptainProg

+0

Я нашел корень проблемы - мой код находится в пределах собственной функции. Как только функция заканчивается, она останавливает воспроизведение звука. Поскольку последнее действие моей функции - воспроизведение тон, звук прекращается до того, как он действительно начнет работать. Как преодолеть это? – CaptainProg

ответ

1

Я нашел решение - проблема в том, что воспроизведение звука прекращается, когда функция завершается. Итак, мне пришлось менять play() на playblocking(). Это предотвращает возврат регулятора до тех пор, пока звук не закончится. Однако это не идеальное решение (было бы неплохо передать управление обратно в родительскую функцию, пока звук все еще воспроизводится), но пока это будет сделано. Если кто-то может предложить способ пройти контроль обратно и играть весь звук, я был бы признателен. Вот окончательный код:

duration = 4 
toneFreq = 440 
samplesPerSecond = 44100; % the bit rate of the tone 
y = sin(linspace(0, duration * toneFreq * 2 * pi, round(duration * samplesPerSecond))); % the equation of the sound wave 
player = audioplayer(y, samplesPerSecond); % play the sound wave at the specified bit rate 
playblocking(player) 

Редактировать: Было также найдено решение, позволяющее продолжить игру после выхода функции. См. MATLAB: Having audioplayer() continue to play after function ends.

+0

Я бы порекомендовал вам добавить к этому ответу, что вы задали новый вопрос о последующей деятельности, поместите ссылку и примите свой ответ. – yuk