结合两个波生成公式不能按预期工作(MATLAB/OCTAVE)

信息处理 matlab 八度
2022-02-06 12:13:08

我正在尝试将锯齿波计算公式转换为 Octave/Matlab 语言。以下是原始公式。我的 Desmos 在这里我有三角波和方波工作的公式,但是锯齿波不会像 Desmos 表中显示的那样以任何一种方式工作(那里有两个最后的公式)。

这是我的 Octave 代码(主动锯计算是评论中上述方程的简化版本):

function saw = saw_wave_trig(fs, f0, s, m, w)
% fs = sample rate
% f0 = fundamental frequency
% s  = 'sharpness'
% w  = 'width'
% m  = 'tooth direction'
% example: saw = saw_wave_trig(44100, 440, 0.03, -2, 1);

t = 0:1/fs:1;
##saw = m .* ((1.+ triangle_wave_trig(fs, (2*(f0/w)+1)/4, s, w) .* ...
##              square_wave_trig(fs, f0/2, s, w))./2) ... 
##     .- sign(m);

##saw =  m .* ...
##            (1 .+ ...
##                  ((1.-(2.*acos((1-s) .* sin((2*pi*((2*(f0/w)+1)/4)).*t')))./pi) .* ...
##                       (2 .* atan(sin((2*pi*(f0/w/2)) .* t')./s))./pi)) ./ ... 
##                         2 .- sign(m);

saw = (4.*asin((s-1).*sin((pi*t'.*(2*f0+w))./ ...
        (2*w))).*acot(s*csc((pi*f0.*t')./w)))./pi^2-sign(m)-1;
     
audiowrite('test_saw_trig_wave.wav',saw, fs);
plot(t, saw);

这(也有注释的计算)产生了一种从负侧三角波到正确的锯齿波的变形,如附图所示(使用 Audacity):

在此处输入图像描述

所以,由于我在数学和 Octave/Matlab 方面的知识非常有限,我的 Octave/Matlab 代码中肯定有一些基础知识做错了。也许三角形和正方形的乘法需要以不同的方式进行?

解决此问题的任何帮助表示赞赏。

笔记!这种方法是我正在用各种方法合成锯齿(和其他类型)波以供音频使用的实验的一部分。

编辑:以下是那些 triangle_wave_trig() 和 square_wave_trig() 函数(Desmos 表中的 f1() 和 f2()),它们都可以正常工作:

function tri = triangle_wave_trig(fs, f0, s, w) 
% fs = sample rate 
% f0 = fundamental frequency 
% s  = 'sharpness' 
% w  = 'width' 
% example: tri = triangle_wave_trig(44100, 440, 0.03, 1); 
 
  t = 0:1/fs:1; 
  tri = 1 .- (2 .* acos((1 - s) .* sin((2 * pi * (f0 / w)) .* t')) ./ pi); 
  
  audiowrite('test_triangle_wave.wav',tri, fs); 
  plot(t, tri);

function sqw = square_wave_trig(fs, f0, s, w)
% fs = sample rate
% f0 = fundamental frequency
% s  = 'sharpness'
% w  = 'width'
% example: sqw = square_wave_trig(44100, 440, 0.03, 1);

  t = 0:1/fs:1;
  sqw = 2.0 .* (atan(sin((2 * pi * (f0 / w)) .* t') ./ s) ./ pi);

  audiowrite('test_square_wave_trig.wav',sqw, fs);
  plot(t, sqw);
  hold on;
  plot(t, square(2*pi*f0*t'));

sqw = square_wave_trig(44100, 440, 0.03, 1); 看起来像这样:

在此处输入图像描述

并且生成的波形文件看起来不错(与三角波函数相同)。

1个回答

好的,@omersayli(dsprelated)解决了这个问题。

t我在(三角波和方波)公式中都将变量放在了错误的位置。下面是计算的正确公式saw

saw = -(2.*m.*asin((s-1)*cos((pi*f0*t)/w)).*acot(s.*csc((pi*f0*t)/w)))./pi^2.-sign(m).+m./2;