Хочу передискретизировать сигнал.
Чистый синус частотой 45.35 гц. Исходная частота дискретизации 6400 Гц. Выборок 128. Хочу передискретизировать так, чтобы во временном окне помещалсяровно период сигнала. Как это сделать?
Использую код, представленный на вашем сайте:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define M_PI 3.14159265358979323846
// Функция сохранения результатов анализа в текстовый файл для
// построения графиков.
void saveToTXT(double* t, double* s, int n, char* fileName){
FILE *file = fopen(fileName, "w");
if(!file) return;
for(int i = 0; i < n; i++)
fprintf(file,"%e\t%e\n",t[i],s[i]);
fclose(file);
}
// Функция расчета кубического полинома
// на основе модифицированного фильтра Фарроу
double farrow3(double *y, double x){
double a3 = (y[3]-y[0])/6.0+(y[1]-y[2])/2.0;
double a1 = (y[3]-y[1])/2.0-a3;
double a2 = y[3]-a3-a1-y[2];
return x*(x*(x*a3+a2)+a1)+y[2];
}
int main(){
double Fs0 = 6400; // исходная частота дискретизации
double Fs1 = 5804.8; // частота дискретизации после ресэмплинга
int N = 128;// количество исходных отсчетов
int K = (int)K*Fs0/Fs1;// количество отсчетов после ресэмплинга
// выделяю память под исходный сигнал
double* y0 = (double*) malloc(N*sizeof(double));
double* t0 = (double*) malloc(N*sizeof(double));
// выделяю память под результат ресэмплинга
double* y1 = (double*) malloc(K*sizeof(double));
double* t1 = (double*) malloc(K*sizeof(double));
// формирую исходный сигнал
for(int i = 0; i<N; i++){
t0[i] = double(i)/Fs0;
y0[i] = sin(2*M_PI*45.35*t0[i]); // гармоническое колебание на частоте 3 кГц.
}
// произвожу ресэмплинг
for(int i = 0; i<K; i++){
t1[i] = (double)i/Fs1; // текущий момент дискретизации
int j = int((double)i*Fs0/Fs1)-2; // пересчитываю индекс исходного сигнала
if(j<0) j =0; // если индекс отрицателььный то приравниваю его к 0
double x = (t1[i]-t0[j])*Fs0-2; // пересчитываю значение x
y1[i] = farrow3(y0+j, x); // фильтр Фарроу
t1[i] *= 1E3; // перевожу время результата ресэмплинга в мс
}
// перевожу исходное время в мс
for(int i = 0; i<N; i++){
t0[i] *= 1E3;
}
// сохраняю результат в файлы
saveToTXT(t0, y0, N, "исходный сигнал.txt");
saveToTXT(t1, y1, K, "resampling.txt");
system("Pause");
return 0;
}
Что то не очень получается(((
Где я ошибаюсь?
P.S. Спасибо за сайт!