如何动态地改变一个正弦波的声音频率?

8视图(30天)
大家好。
我现在目标是应用程序编程 生成音频频率正弦波,这样随着时间的推移增加或减少。
然而,用户应该能够 使用上下键以抵消这种漂移
例如:如果频率下降随着时间的推移,用户应该能够动态地按了键增加。
问题是我找不到任何信息关于如何这样的事。我一直在使用
soundsc(音频、fs)
函数允许声音在给定的采样率,但我总是必须创建函数的正弦波在喂食前,不会留下任何余地 动态的变化
有可能这样做在Matlab ?如果是这样,这个函数允许你做什么?如果没有功能,我该如何继续?
这是我当前的代码,如果你想看一看:
% soundTesting.m
fs = 16000;
s = generateWave(400年,1,fs, 5);
t = generateTarget (800 1, fs, 5, 0.5);
音频=[年代;t]”;
%在立体声音频右边目标音频扬声器和漂流正弦波在左边
%注意现在正弦波不是漂流。
soundsc(音频、fs);
% generateWave.m
函数波= generateWave(频率、振幅、fs、长度)
ts = 1 / f;
t = 0: ts:长度;
波=振幅* sin(2 *π*频率* t);
结束
% generateTarget.m
函数目标= generateTarget(频率、振幅、fs、长度、间距)
波= generateWave(频率、振幅、fs、长度);
目标= 0(大小(波));
i = 1:长度- 1
%每秒钟,排放目标声音跨度秒。
目标(我* * fs: fs + int32(跨度* fs)) =波(我* * fs: fs + int32(跨度* fs));
结束
结束
我以为关于试图创建多个音频和转移频率随着时间的推移,所以我写了这段代码。然而,杀死的第一个信号,以发挥第二个不是运行平稳。事实上,有一个空白的第一个声音是清除之后……
fs = 16000;
s = generateWave(400年,1,fs, 5);
t = generateTarget (800 1, fs, 5, 0.5);
音频= buildStereo (s, t);%简单地创建了一个包含s和t矩阵,以便它可以在立体音响
1 s2 = generateWave(1200年,fs, 5);
audio2 = buildStereo (s2, t);
soundsc(音频、fs);
暂停(2)
清晰的声音%不光滑,有一个空白之后第一个声音是清除
soundsc (audio2 fs)
非常感谢。

接受的答案

杰夫•海斯
杰夫•海斯 2021年5月18日
皮埃尔-我不认为你可以动态地改变频率,即使使用 audioplayer 。我认为你可以用一个球员,等待它停止在应用频率变化然后重新启动之前玩家扮演新的频率。例如,下面的代码将一个信号在一个初始频率和继续发挥它在那个frequencey(或其他),直到用户停止(按“x”)。
函数AudioPlayerFrequencyExample
关闭所有;
%初始化audioplayer
durationSec = 2;
Fs = 8000;
t = linspace (0 durationSec durationSec * Fs);
frqHz = 100;
Y =罪(2 *π* frqHz * t);
audioPlayer1 = audioplayer (Y, Fs);
stopAudioForAlways = false;
freqDeltaHz = 0;
%创建图和分配回调
hFig =图;
集(hFig,“WindowKeyPressFcn”,@keyPressCallback);
函数eventdata keyPressCallback (~)
%如果需要启动播放器
如果~ isplaying (audioPlayer1)
restartAudioPlayerIfStopped ();
结束
%确定键被按下
keyPressed = eventdata.Key;
如果strcmpi (keyPressed“向上光标键”)
%增加10赫兹的频率
freqDeltaHz = 10;
elseifstrcmpi (keyPressed“downarrow”)
%减少10赫兹的频率
freqDeltaHz = -10;
elseifstrcmpi (keyPressed“x”)
%阻止球员
stopAudioForAlways = true;
结束
结束
函数restartAudioPlayerIfStopped (~ ~)
%重启播放器(可能)新的频率
如果~ stopAudioForAlways
frqHz = frqHz + freqDeltaHz;
Y =罪(2 *π* frqHz * t);
freqDeltaHz = 0;
audioPlayer1 = audioplayer (Y, Fs);
audioPlayer1。StopFcn = @restartAudioPlayerIfStopped;
玩(audioPlayer1);
结束
结束
结束
请注意,有一个暂停当玩家停止,然后重新启动以不同的频率。我试着尝试两个球员,这样我可以开始一个然后停止正在运行的球员,但注意到点击(静态)声音在过渡。
2的评论
杰夫•海斯
杰夫•海斯 2021年5月19日
Hii皮埃尔——是的,有两个球员在我的Macbook,我很难创建一个无缝的频率的变化。我没有 音频工具箱 但也许可以使用这里的东西(如果你有这个工具箱)。的 实时参数调优 可以提供一些有趣的事情。

登录置评。

更多的答案(0)

类别

找到更多的在音频插件创建和托管帮助中心文件交换

下载188bet金宝搏


释放

R2014a

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!

翻译的