30 Ocak 2018 Salı

baud nedir

baud ve bit Farkı
Baud ile bit farklı şeylerdir. Baud gönderilen sinyal sayısını belirtir.
A baud rate is the number of times a signal in a communications channel changes state or varies. For example, a 2400 baud rate means that the channel can change states up to 2400 times per second. The term “change state” means that it can change from 0 to 1 or from 1 to 0 up to X (in this case, 2400) times per second.
Yani baud state veya sembol değişiminin hızıdır. Açıklaması şöyle.
The rate of symbols is called "baud".
sembol nedir
Açıklaması şöyle.
"Symbol" is the word used to describe the process of mapping hardware signals (such as voltages or magnetic patterns) into logical bits. If a symbol may have 4 states, it can encode 2 bits worth of information
sembol ve voltaj arasıdaki ilişki şöyle.
If I have a 0-5V wire, and 2 states per symbol (1 bit), my two states are 0V and 5V, with 5V between each symbol. If I have the same wire, but encode 4 states per symbol (2 bits), my states are 0V, 1.66V, 3.33V and 5V. That's 1.66V between each symbol. It's now easier for noise to corrupt my signal.
Bir simbol tek bir bit taşımak zorunda değildir. Modülasyon tekniğine bağlı olarak bir veya daha fazla bit taşıyabilir.

Matematik
Örnek
Kabaca şöyle yaparız.

Bir baud ile bir bit taşırsak ve 9600 baud ve length = 8 ve stop bit = 10 ise

Her byte için = 10/9600 = 1041.66666666 microsaniye = 1.041 milisaniye harcanır

256 byte için yaklaşık  266 miliseconds harcanır

29 Ocak 2018 Pazartesi

IEEE 754 - Extended Precision

X87 - 32 bit Derleme
X87 FPU yazısına göz atabilirsiniz.

fdiv
Sanırım bölme işlemi yapıyor.

fistp
float -> int çevrimi için kullanılır.

mov
Kullanım şekli şöyle.
mov mem, reg
mov reg, mem
mov reg, reg
mov reg, imm
mov mem, imm
Açıklaması şöyle
Most x86 instructions (other than some specialized instructions such as movsb) can only access one memory location. Therefore a move from memory to memory requires going through a register with two mov instructions.
Elimizde şöyle bir kod olsun
x = y;
Assembly kodu şöyledir
movl    -0x8(%rbp), %esi
movl    %esi, -0xc(%rbp)
Streaming SIMD Extensions 2 - SSE2 - 64 bit Derleme
Tüm modern işlemciler (Intel veya AMD) SSE2'yi desteklerler.Açıklaması şöyle.
SSE2 was introduced into Intel chips with the Pentium 4 in 2001 and AMD processors in 2003
Visual Studio 2012'den itibaren 64 bit kodlar için SSE2 kodları üretiyor. SSE2 kodları XMM yazmaçlarını kullanır. Assembly kodu şöyledir
movsd   QWORD PTR [rsp+8], xmm1
call    cos
movsd   xmm1, QWORD PTR [rsp+8]
movsd   QWORD PTR [rsp], xmm0
movapd  xmm0, xmm1
call    cos
movsd   xmm2, QWORD PTR [rsp]
ucomisd xmm2, xmm0
divss
Sanırım bölme işlemi yapıyor. gcc'de şöyle yaparız.
__m128 s1, s2;
s1 = _mm_set_ps(1.0, 1.0, 1.0, 1.0);
s2 = _mm_set_ps(0.0, 0.0, 0.0, 0.0);
s2 = _mm_div_ss(s1, s2);
_mm_loadu_si128 
Elimizde bir dizi olsun.
short* tempBufferVert = new short[width * height];
Dizideki her elemanı 4 il bölmek için şöyle yaparız.
#include <emmintrin.h> // SSE2

for (int i = 0; i < width * height; i += 8)
{
  __m128i v = _mm_loadu_si128((__m128i *)&tempBufferVert[i]);
  v = _mm_srai_epi16(v, 2); // v >>= 2
  _mm_storeu_si128((__m128i *)&tempBufferVert[i], v);
}
setcsr
Şöyle yaparız.
_mm_setcsr (0x00001D80);
Intel 80 bit floating point
80 bitlik precision bazı C++ derleyicileri tarafından kullanılabiliyor. Açıklaması şöyle.
The C++ standard allows implementations to evaluate floating-point expressions with more precision than the nominal type requires.
C# için de aynı kural geçerli.Açıklaması şöyle.
In particular, in some situations the JIT is permitted to use a more accurate intermediate representation - e.g. 80 bits when your original data is 64 bits - whereas in other situations it won't. That can result in seeing different results when any of the following is true:
Bir başka açıklama şöyle.
The IEEE 754 specifies that computations can be processed at a higher precision than what is stored in memory then rounded when written back to memory ..... In short, the standard does not promise that the same computation carried out on all hardware will return the same answer.
Örnek
Aşağıdaki basit örnekte derleyicinin iki double sayısını çarparken fazla precision kullandığını görebiliriz.
#include <cstdint>
#include <cinttypes>
#include <cstdio>

using namespace std;

int main() {
    double xd = 1.18;
    int64_t xi = 1000000000;

    int64_t res1 = (double)(xi * xd);

    double d = xi * xd;
    int64_t res2 = d;

    printf("%" PRId64"\n", res1);
    printf("%" PRId64"\n", res2);
}
Çıktı olarak şunu alırız.
1179999999
1180000000
Örnek
32 ve 64'bitlik uygulamalar arasında da farklar olabilir.
long double dvalue = 2.7182818284589998;
long double dexp = -0.21074699576017999;
long double result = std::powl( dvalue, dexp)
Sonuç olarak şunu alırız.
64bit -> result = 0.80997896907296496 and 32bit -> result = 0.80997896907296507
FPU içindeki kayan nokta hesaplaması için kullanılan register'lar 80 bit olabiliyor.

C ile kullanılan long double 80 bitlik bu veri tipine denk gelebilir. Bu durumda iki farklı makine arasında aynı hesaplamayı yapsak bile farklı sonuçlar elde edilebilir. Derleyiciler strict mode çalışmaya zorlanarak farklı makineler arasında aynı sonucu elde etmek mümkün.

C++
1. /fp:precise - MS derleyici için kullanılır
Varsayılan seçenek budur. Açıklaması şöyle
fp:precise weakens some of the rules, however it warranties that the precision of the calculations will not be lost.
Ara değerlerin (intermediate value) FPU registerlarında saklanmasına müsaade etmez. Hesaplamadan sonra ara değerler bellekteki alana geri yazılır. Açıklaması şöyle özellike x87 kodlarında bu açıklama önemli.
If the value to be computed on is placed on a larger register then one computation is done and then the value is moved off of the register back to memory the result is truncated there. It could then be moved back on to the larger register for another computation.
On the other hand if all the computations are done on the larger register before the value is moved back to memory you will get a different result.
Bu seçenek Visual C++ 6.0 ile kullanılan /Op (Improve Float Consistency) seçeneğinin yerini almıştır. Eski seçenek için de benzer bir açıklama Açıklaması şöyleydi
By default, the compiler uses the coprocessor’s 80-bit registers to hold the intermediate results of floating-point calculations. This increases program speed and decreases program size. However, because the calculation involves floating-point data types that are represented in memory by less than 80 bits, carrying the extra bits of precision (80 bits minus the number of bits in a smaller floating-point type) through a lengthy calculation can produce inconsistent results.
2. /fp:strict - MS derleyici için kullanılır
Platformlar arasında uyumluluğu sağlamak için yukarıdaki gibi 80 bitlik floating point hesaplamalarını kullanılmaz. Açıklaması şöyle
Using fp:strict means that all the rules of IEEE 754 are respected. fp:strict is used to sustain bitwise compatibility between different compilers and platforms.

Java
strictfp yazısına taşıdım

3. /fp:fast
Açıklaması şöyle
fp:fast allows compiler specific optimizations and transformations of expressions containing floating point calculation. It is the fastest methods but the results will differ between different compilers and platforms.


Poisson Approximation

Poisson Approximation
Açıklaması şöyle. n tekrar etme sayısı, p ise gerçekleşme olasılığıdır
When n is large, p is small and np<10, then the Poisson approximation is very good.
Formülü şöyle

Lambda gerçekleşme olasılığını temsil eder.

Poisson Distribution
poisson_distribution bir zaman aralığı içinde n sayıda olayın olma olasılığını hesaplar. Örneğin 90 dakikada 6 gol atılması. Açıklaması şöyle.
In a Poisson process we have events occurring at some specified rate λ>0 and we can analyse the process by looking either at the time between events, or the number of events in a given time.

26 Ocak 2018 Cuma

sched_setaffinity metodu

Giriş
Şu satırı dahil ederiz.
#include <sched.h>
Bu metod Linux'a mahsustur ve programın içinden hangi işlemciye bağlanmak istendiği belirtilir.

Metoda geçilen ilk parametre yani 0 değeri, kendi uygulamamızı belirtir. Başka bir uygulamayı bağlamak için, hedef uygulamanın PID değerini kullanmak gerekir.

Örnek
Şöyle yaparız.
#include <sched.h>

cpu_set_t  mask;
CPU_ZERO(&mask);
CPU_SET(0, &mask);
CPU_SET(2, &mask);
result = sched_setaffinity(0, sizeof(mask), &mask);
Örnek
Şöyle yaparız.
#include <sched.h>
#include <stdlib.h>
#include <assert.h>

void pinThreadToCore(int id) {
  cpu_set_t cpuset;
  CPU_ZERO(&cpuset);
  CPU_SET(id, &cpuset);
  assert(sched_setaffinity(0, sizeof(cpuset), &cpuset) == 0);
}

int main(int argc, char** argv) {
  pinThreadToCore(atoi(argv[1]));
  while (1);
}

25 Ocak 2018 Perşembe

OpenCV Operations on Arrays

abs metodu
Örnek ver

absdiff metodu
Örnek ver. Arka plan (background) resim ile ön plan resim arasındaki farkı bulmak için kullanılır. Birinci parametre arka plan resimdir. Şöyle yaparız.
cv::Mat diffImage;
cv::absdiff(backgroundImage, currentImage, diffImage);

cv::Mat foregroundMask = cv::Mat::zeros(diffImage.rows, diffImage.cols, CV_8UC1);

float threshold = 30.0f;
float dist;

for(int j=0; j<diffImage.rows; ++j)
  for(int i=0; i<diffImage.cols; ++i)
  {
    cv::Vec3b pix = diffImage.at<cv::Vec3b>(j,i);

    dist = (pix[0]*pix[0] + pix[1]*pix[1] + pix[2]*pix[2]);
    dist = sqrt(dist);

    if(dist>threshold)
    {
      foregroundMask.at<unsigned char>(j,i) = 255;
    }
  }
}
add metodu
Örnek ver

addWeighted metodu
Örnek ver

bitwise_and metodu
Örnek ver

bitwise_not metodu
Örnek ver

bitwise_or metodu
Örnek ver

bitwise_xor metodu
Örnek ver

calcCovarMatrix metodu
Örnek ver

cartToPolar metodu
Örnek ver

checkRange metodu
Örnek ver

compare metodu
Örnek ver

completeSymm metodu
Örnek ver

convertScaleAbs metodu
Örnek ver

countNonZero metodu
Örnek ver

cvarrToMat metodu
Örnek ver

dct metodu
Örnek ver

dft metodu
Örnek ver

divide metodu
Örnek ver

determinant metodu
Örnek ver

eigen metodu
Örnek ver

exp metodu
Örnek ver

extractImageCOI metodu
Örnek ver

insertImageCOI metodu
Örnek ver

flip metodu
Örnek ver

gemm metodu
Örnek ver

getConvertElem metodu
Örnek ver

getOptimalDFTSize metodu
Örnek ver

idct metodu
Örnek ver

idft metodu
Örnek ver

inRange metodu
Örnek ver

invert metodu
Örnek ver

log metodu
Örnek ver

LUT metodu
Örnek ver

magnitude metodu
Örnek ver

Mahalanobis metodu
Örnek ver

max metodu
Örnek ver

mean metodu
Örnek ver

meanStdDev metodu
Örnek ver

merge metodu
Örnek ver

min metodu
Örnek ver

minMaxIdx metodu
Örnek ver

minMaxLoc metodu
Şöyle yaparız.
cv::Mat mat = ...;
double min, max;
cv::minMaxLoc(label, &min, &max); // min = 0, max = 5811

mixChannels metodu
Örnek ver

mulSpectrums metodu
Örnek ver

multiply metodu
Örnek ver

mulTransposed metodu
Örnek ver

norm metodu
Örnek ver

normalize metodu
Örnek ver

PCA metodu
Örnek ver

PCA::PCA metodu
Örnek ver

PCA::operator () metodu
Örnek ver

PCA::project metodu
Örnek ver

PCA::backProject
Örnek ver

perspectiveTransform
Örnek ver
phase
Örnek ver
polarToCart
Örnek ver
pow
Örnek ver
RNG
Örnek ver
RNG::RNG
Örnek ver
RNG::next
Örnek ver
RNG::operator T
Örnek ver
RNG::operator ()
Örnek ver
RNG::uniform
Örnek ver
RNG::gaussian
Örnek ver
RNG::fill
Örnek ver

randu
Örnek ver

randn metodu
Resme gürültü katmak için şöyle yaparız.
cv::Mat noise(src.size(),src.type());
float m = (10,12,34);
float sigma = (1,5,50);
cv::randn(noise, m, sigma); //mean and variance
src += noise;
Gürültüyü gidermek için (denoising) açıklama şöyle
OpenCV provides four variations of this technique.
cv2.fastNlMeansDenoising() - works with a single grayscale images
cv2.fastNlMeansDenoisingColored() - works with a color image.
cv2.fastNlMeansDenoisingMulti() - works with image sequence captured in short period of time (grayscale images)
cv2.fastNlMeansDenoisingColoredMulti() - same as above, but for color images.
Common arguments are:
h : parameter deciding filter strength. Higher h value removes noise better, but removes details of image also. (10 is ok)
hForColorComponents : same as h, but for color images only. (normally same as h)
templateWindowSize : should be odd. (recommended 7)
searchWindowSize : should be odd. (recommended 21)
randShuffle metodu
Örnek ver

reduce metodu
Örnek ver

repeat metodu
Örnek ver

scaleAdd metodu
Örnek ver

setIdentity metodu
Örnek ver

solve metodu
Örnek ver

solveCubic metodu
Örnek ver

solvePoly metodu
Örnek ver

sort metodu
Örnek ver

sortIdx metodu
Örnek ver

split metodu
Şöyle yaparız. Frame önce RGBA'dan RGB'ye çevrilir. RGB'den de HLS'ye çevrilir. split() ile 3 kanala ayrılır. Kanal üzerinde değişklik yapılır. Yeni kanal ve frame birleştirilir. Frame HLS'den RGB'ye çevrilir.
void applyContrastBrightnessToFrame(Mat &frame, int brightness)
{
  cvtColor(frame, frame, CV_RGBA2RGB);
  cvtColor(frame, frame, CV_RGB2HLS);
  vector<Mat> hlsChannels(3);
  split(frame, hlsChannels);
  hlsChannels[1] += brightness; //adding brightness to channel 2(lightness channel)
  merge(hlschannels, frame);
  cvtColor(frame, frame, CV_HLS2RGB);
  cvtColor(frame, frame, CV_BGR2RGBA);
}

sqrt metodu
Örnek ver

subtract metodu
Örnek ver

SVD metodu
Örnek ver

SVD::SVD metodu
SVD::operator () metodu
SVD::compute metodu
SVD::solveZ metodu
SVD::backSubst metodu

sum metodu
Örnek ver

theRNG 
Örnek ver

trace metodu
Örnek ver

transform metodu
Örnek ver

transpose metodu
Örnek ver