Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Matlab中尝试来回交叉衰减两个正弦信号时出现故障_Matlab_Signal Processing - Fatal编程技术网

在Matlab中尝试来回交叉衰减两个正弦信号时出现故障

在Matlab中尝试来回交叉衰减两个正弦信号时出现故障,matlab,signal-processing,Matlab,Signal Processing,我试图在Matlab中创建一些函数,记录一个音调,然后半连续播放。例如,我希望用户能够吹口哨2秒,并将口哨拖到10秒。我想避免使用花哨的时间拉伸算法,但只是通过重复使用它。我知道这有问题,但我做这个是为了实验 要做到这一点,我需要交叉淡入声音的开头和结尾,使其看起来连续。我写了一个crossfade函数,它接受两个信号并在它们之间衰减 这个想法是有一个sigmoid音量函数,对于旧的声音从1到0,对于新的声音从0到1。然后我把信号乘以这个体积函数,把结果相加。我对sigmoid函数的理解是,得到

我试图在Matlab中创建一些函数,记录一个音调,然后半连续播放。例如,我希望用户能够吹口哨2秒,并将口哨拖到10秒。我想避免使用花哨的时间拉伸算法,但只是通过重复使用它。我知道这有问题,但我做这个是为了实验

要做到这一点,我需要交叉淡入声音的开头和结尾,使其看起来连续。我写了一个crossfade函数,它接受两个信号并在它们之间衰减

这个想法是有一个sigmoid音量函数,对于旧的声音从1到0,对于新的声音从0到1。然后我把信号乘以这个体积函数,把结果相加。我对sigmoid函数的理解是,得到的体积应该是两个输入信号的平均值,重量从输入信号a缓慢移动到输入信号b,输出振幅应该与输入振幅相同

然而,当我用两个简单的正弦波输入信号来尝试这一点,并在低音和高音之间来回切换时,我在从低到高的部分转换到高到低的滑动部分的部分中遇到了一个小“小故障”。这是从哪里来的?我也不确定这是否只是在我的扬声器上,我试着在时域中观察绘制的波形,但在特定的时间没有看到任何奇怪的事情发生

第一节的结尾和最后一节的开头应该有完全相同的频率分量,并且没有任何东西在时间上移动,所以我不确定这个小故障来自哪里

示例代码:

(轻微警告:这会输出一些音调,其中一个音调有点高,因此可能无法在耳机打开或音量全开的情况下播放)

我甚至试着做了第二个交叉淡入,我把第一个和第二个信号的结束和开始缝合在一起,但在过渡时听起来仍然有点奇怪。你知道如何使过渡顺利吗

function [out] = stitchandrepeat2(in, in2, Fs)
lowtohigh = crossfade(in,in2,1);
hightolow = crossfade(in2,in,1);
secstofade = 0.1;
len = size(lowtohigh,1);
partsize = secstofade*Fs;
lthpart = lowtohigh((len-partsize+1):len,:);
htlpart = hightolow(1:partsize,:);
lthcropped = lowtohigh(1:len-partsize,:);
htlcropped = hightolow(partsize+1:len,:);

highfade = crossfade(htlpart, lthpart,1);
out = [lthcropped;highfade;htlcropped];
out = [out;out];
out = [out;out];
out = [out;out];
end
为什么我在声音的低处听不到这种小故障的声音?(两种不同的声波也在那里连接起来。)

function [out] = stitchandrepeat2(in, in2, Fs)
lowtohigh = crossfade(in,in2,1);
hightolow = crossfade(in2,in,1);
secstofade = 0.1;
len = size(lowtohigh,1);
partsize = secstofade*Fs;
lthpart = lowtohigh((len-partsize+1):len,:);
htlpart = hightolow(1:partsize,:);
lthcropped = lowtohigh(1:len-partsize,:);
htlcropped = hightolow(partsize+1:len,:);

highfade = crossfade(htlpart, lthpart,1);
out = [lthcropped;highfade;htlcropped];
out = [out;out];
out = [out;out];
out = [out;out];
end