我为 iPhone 编写了一个小型软件合成器。为了进一步调整性能,我使用 Shark 测量了我的应用程序,发现我在转换方面损失了大量时间float/SInt16。
因此,我重写了一些部分,通过预先计算返回“即用型”SInt16样本的查找表来绕过转换。到目前为止效果很好。
目前,我正在尝试重写一些过滤器和我的 ADSR 包络实现,以仅使用整数算术,但我可以使用一些关于如何在没有浮点数的情况下执行乘法/除法的技巧。
我的目标是iPhone 规范格式:
在不使用浮子的情况下将振幅应用于最终样本的好方法是什么?
编辑:
到目前为止我唯一想到的是,我可以通过右移当前样本来除以 2 的幂。
inBuffer[frame] = wavetable[i % cycleLengthInSamples] >> 4;
Run Code Online (Sandbox Code Playgroud)
但我想不出任何优雅的方法来创建平滑的 ADSR 信封。
Edit2:
感谢您的所有精彩回答!
我目前的做法:
SInt16范围SInt32)这似乎有效:)
iphone signal-processing fixed-point core-audio integer-division
我在这里使用Visual C++ 2008(9.x),当我遇到生成DIV而不是IDIV的编译器时,我正准备一个固定点值.我将代码折叠成一小块以完全重现:
short a = -255;
short divisor16 = 640; // unsigned, 16-bit
unsigned int divisor32 = 640; // unsigned, 32-bit
unsigned short s_divisor16 = 640; // signed, 16-bit
int s_divisor32 = 640; // signed, 32-bit
int16_t test1 = (a<<8)/divisor16; // == -102, generates IDIV -> OK
int16_t test2 = (a<<8)/s_divisor16; // == -102, generates IDIV -> OK
int16_t test3 = (a<<8)/divisor32; // == bogus, generates DIV -> FAIL!
int16_t test4 = (a<<8)/s_divisor32; // == -102, generates IDIV -> …Run Code Online (Sandbox Code Playgroud) 我想在VB.NET中执行整数除法,即只保留除法结果的整个部分.
Dim a, b, c as int32
a = 3500
b = 1200
c = a/b
Run Code Online (Sandbox Code Playgroud)
这个例子输出3.
如何让它返回2?
我正在 MySQL 中处理用户定义的函数,该函数采用整数 (mediumint) 并将其除以 100(即 10785 / 100 = 107.85)。提供的整数是一个称为时间的参数。我试过了
DECLARE dtime FLOAT;
SET dtime = time / 100;
DECLARE ftime VARCHAR(10);
Run Code Online (Sandbox Code Playgroud)
这导致了错误,我假设是因为我将两个整数相除并将其分配给一个浮点数
MySQL said: #1064 - You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near
'DECLARE ftime VARCHAR(10);
Run Code Online (Sandbox Code Playgroud)
我也试过
SET dtime = CAST(time as FLOAT) / 100.0;
Run Code Online (Sandbox Code Playgroud)
但这会引发错误,因为您似乎无法将数字转换为浮点数。最后,我尝试使用十进制
DECLARE dtime DECIMAL(10,10);
SET dtime = CAST(time AS decimal(10,10)) / CAST(100 as decimal(10,10);
DECLARE …Run Code Online (Sandbox Code Playgroud) mysql floating-point user-defined-functions integer-division
在具有有理数的小学数学中,表达式(a / b) / c相当于a / (b * c)基本的代数操作.
/在C和大多数其他语言中截断整数除法时是否相同?也就是说,我可以用所有除数的乘积用一个除法代替一系列的除法吗?
你可以假设乘法不会溢出(如果是的话,显然它们不是等价的).
据我所知,如果我们使用带有8位数字的div指令,那么商是存储在AL中的8位数字,余数也是存储在AH中的8位数字
但是如果我们将 16 位数字除以 1 呢?
每当执行下面的代码时,我的指令指针就会丢失。
MOV AX, 9999H
MOV BL, 1
DIV BL
Run Code Online (Sandbox Code Playgroud)
有没有什么办法可以强制8086在除以AX时使用ax作为商并使用ax作为余数?
一个熟悉的事实是,当整数除以 2 的幂时,好的编译器会将其强度减少为位移。
例如:
int main(int argc, char **argv) {
return argc/2;
}
Run Code Online (Sandbox Code Playgroud)
Clang -O2 将其编译为:
movl %ecx, %eax
shrl $31, %eax
addl %ecx, %eax
sarl %eax
retq
Run Code Online (Sandbox Code Playgroud)
值得注意的是,虽然这一系列指令比实际的除法指令快得多,但它并不像人们希望的那样只是一个位移。大概这是因为典型的 CPU 和 C 最终解决了截断除法(商向零舍入),而这恰好与算术右移不完全匹配(并且需要强度减少以完全保留语义)。
哪一种口味符号整数除法的将完全匹配算术右移?
当我使用以下代码时,我试图复制sqrt(x)某物等于的想法X^(1/2)
pow(x, (1/2);
Run Code Online (Sandbox Code Playgroud)
无论我输入什么值,它都返回 1。我已经用 sqrt 函数解决了这个问题,但想知道为什么将来会发生这种情况。
我试图使用 emu8086 工具将(无符号)8A32F4D5除以C9A5。我预计商为AF73H,余数为94B6H。编写以下代码后,我得到了正确的商,但余数变成了0000h。我错过了什么吗?
.MODEL SMALL
.STACK 100H
.DATA
.CODE
MAIN PROC
; initialize DS
MOV AX,@DATA
MOV DS,AX
; enter your code here
MOV DX, 8A32H
MOV AX, 0F4D5H
MOV BX, 0C9A5H
DIV BX
;exit to DOS
MOV AX,4C00H
INT 21H
MAIN ENDP
END MAIN
Run Code Online (Sandbox Code Playgroud)
EMU8086中的输出:
我很好奇将两个值除以不同数量的值位但操作数(寄存器)位不变时的性能差异。我预计性能取决于被除数的最高设置位,因为我假设 CPU 内部的迭代减法和移位“算法”可能在一个时钟周期内进行多次迭代。
所以我写了一个 C++20 程序来测试这个:
#include <iostream>
#include <iostream>
#include <type_traits>
#include <cstdint>
#include <random>
#include <limits>
#include <atomic>
#include <chrono>
#include <vector>
#include <sstream>
using namespace std;
using namespace chrono;
int main()
{
constexpr size_t ROUNDS = 100'000'000;
auto ssp = []<typename TOp, typename TValue>() -> double
requires is_unsigned_v<TOp> && is_unsigned_v<TValue> && (sizeof(TOp) >= sizeof(TValue))
{
constexpr size_t N = 0x1000;
vector<TOp> vDividends( N ), vDivisors( N );
mt19937_64 mt;
uniform_int_distribution<unsigned> uidBits( 0, sizeof(TValue) * CHAR_BIT - 1 …Run Code Online (Sandbox Code Playgroud) integer-division ×10
assembly ×4
c ×3
x86 ×2
x86-16 ×2
bit-shift ×1
c++ ×1
core-audio ×1
division ×1
emu8086 ×1
fixed-point ×1
iphone ×1
math ×1
mysql ×1
performance ×1
syntax ×1
tasm ×1
vb.net ×1