Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.06.03;
Скачать: CL | DM;

Вниз

Частота   Найти похожие ветки 

 
Sergo ©   (2002-04-24 13:08) [0]

Как можно получить частоту входного сигнала на звукаху?


 
VictorT ©   (2002-04-24 13:21) [1]

С амплитудой разобрался?

Формула для частоты:
f = 1/T,
где Т - период.
Чтобы определить период, я думаю можно замерять время между соседними локальными максимумами. Если опять выразился непонятно, приведу текст программы.


 
Sergo ©   (2002-04-24 13:29) [2]

>VictorT ©
Спасибо что опять откликнулся. Да с амплитудой я разобрался.
Формула для частоты:
f = 1/T,
где Т - период.

Эту формулу я знаю, а вот с замером времени... если не трудно напиши код.
А через БПФ нельзя узнать?


 
VictorT ©   (2002-04-24 13:46) [3]

Не знаю, что такое БПФ :(

Сейчас ухожу на обед, код напишу чуть позже.


 
Sergo ©   (2002-04-24 13:48) [4]

БПФ это быстрое преобразование фурье


 
Digitman ©   (2002-04-24 14:38) [5]

Вот сиди тут и думай, о какой "частоте" ты речь ведешь ...
БПФ как раз есть первое , что можно рекомендовать. Ты ж ничего не сказал о заведомо определенной АЧХ анализируемого сигнала : сложный сигнал или нет, меняется спектр во времени или нет, периодически или апериодически ... Может, это вообще - "белый шум" ? Тогда задача нерешаемая.


 
Sergo ©   (2002-04-24 15:28) [6]

>Digitman ©
Сигнал предполагается практически неизменным во времени по амплитуде и частоте, но все же эти параметры могут меняться, спонтанно.


 
AFROLOV ©   (2002-04-24 15:41) [7]

Надо не промахнуться с частотой дискретизации при снятии АЧХ - посмотри "Теорема Котельникова". Иначе можно получить кучу мусора (при низкой частоте дискретизации) или много лишних данных (при высокой) - как следствие очень большое время обработки.


 
Digitman ©   (2002-04-24 15:41) [8]

>Sergo

Какой частоте-то ? Какой гармоники ? Если гармоник нет, можно и без БПФ обойтись. Иначе задача сводится к определению частоты осн.тона сигнала, имеющего постоянный спектр.состав, а это как раз и дает повод как минимум для применения БПФ


 
VictorT ©   (2002-04-24 15:50) [9]

Да, после написаного тут наверное надо погодить с кодом, вначале получше разобраться с проблемой.


 
Sergo ©   (2002-04-24 15:54) [10]

>Digitman ©
Частота в диапазоне 50 Гц +-10гц, гармоник: в лучшем случае одна, в худшем 3, количество гармоник я контролировать (они также возникают спонтанно) не могу, но мне их нужно отследить.


 
Sergo ©   (2002-04-24 15:55) [11]

Сигнал моно 8бит, частота дискретизации 22,5 кГц.


 
VictorT ©   (2002-04-24 15:56) [12]

Да, кстати, гляньте сюда:
http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1018853239&n=3
всё ли там в порядке, а то в свете вышенаписаного сомнения возникли.


 
Sergo ©   (2002-04-24 15:59) [13]

> VictorT ©
А зачем туда смотреть?


 
AFROLOV ©   (2002-04-24 16:02) [14]

Для надежного разделения сигналов с близкими частотами необходим большой периуд наблюдения.


 
Sergo ©   (2002-04-24 16:04) [15]

>AFROLOV ©
Насколько большой?


 
VictorT ©   (2002-04-24 16:07) [16]


> А зачем туда смотреть?

Да подумал, что тот метод может не подходить.


 
Sergo ©   (2002-04-24 16:13) [17]

>VictorT ©
Да меня тоже берут сомнения, можно попробовать загонять данные за кокайто промежуток времени в массив и искать там максимальное значение (to all это у нас с VictorT © маленькое "лирическое" отступление от темы :))


 
AFROLOV ©   (2002-04-24 16:20) [18]

Надо формулы посмотреть - я так не помню. Но чем ближе частоты тем больше должен быть периуд наблюдения.<=> Чем больше периуд наблюдения тем более близкие по частоте сигналы можно достоверно разделить.=> Преуд наблюдения выбирается из следующих соображений:
1. Минимальной разности частот между 2 сигналами, которые считаются разными.
2. Других соображений(скорость обработки, и т.д.)

Кстати, увеличение частоты дискретизации в разделении сигналов тебе не поможет.


В любой приличной книжке по обработке сигналов это есть.


 
Digitman ©   (2002-04-24 16:25) [19]

>Sergo
Если 50Гц и гармоник не более 2-х, что мешает тебе установить частоту дискретизации, равной, скажем, 4кГц ? При такой частоте дискретизации БПФ при минимальных ресурсах системы вполне справится со своей задачей в real-time !


 
Sergo ©   (2002-04-24 16:26) [20]

>AFROLOV ©
Спасибо
Но разделение сигналов не суть. Пойдем по легкому пути будем считать, что гармоника одна :)).
Но проблема так и не решилась :((. Как узнать частоту?


 
VictorT ©   (2002-04-24 16:26) [21]

Посмотрел теорему Котельникова, если правильно понял, то частота дискретизации в данном случае должна быть 120 Гц.


 
Sergo ©   (2002-04-24 16:30) [22]

Digitman ©
Я думал об этом. У меня есть готовый алгоритм БПФ, его мне дал HeadHanter (одно время он находился здесь, а счас че то не видать) вот его код:
А где здесь частота я че то не найду :((
unit dsp;


interface

type
TWaveHeader = record
Marker1: Array[0..3] of Char;
BytesFollowing: LongInt;
Marker2: Array[0..3] of Char;
Marker3: Array[0..3] of Char;
Fixed1: LongInt;
FormatTag: Word;
Channels: Word;
SampleRate: LongInt;
BytesPerSecond: LongInt;
BytesPerSample: Word;
BitsPerSample: Word;
Marker4: Array[0..3] of Char;
DataBytes: LongInt;
end;



procedure ClassicDirect(Var aSignal, aSpR, aSpI: Array Of single; N:LongInt);
procedure ClassicInverce(Var aSpR, aSpI, aSignal: Array Of single;N:LongInt);


implementation

function Power2(lPower: Byte): LongInt;

begin
Result := 1 Shl lPower;
end;


procedure ClassicDirect(Var aSignal, aSpR, aSpI: Array Of single; N:
LongInt);

var lSrch : LongInt;
var lGarm : LongInt;
var dSumR : single;
var dSumI : single;
begin
for lGarm := 0 to N div 2 - 1 do begin
dSumR := 0;
dSumI := 0;
for lSrch := 0 to N - 1 do begin
try dSumR := dSumR + aSignal[lSrch] * Cos(lGarm * lSrch / N * 2 * PI);
except end;
try dSumI := dSumI + aSignal[lSrch] * Sin(lGarm * lSrch / N * 2 * PI);
except end;
end;
aSpR[lGarm] := dSumR;
aSpI[lGarm] := dSumI;
end;
end;

procedure ClassicInverce(Var aSpR, aSpI, aSignal: Array Of single; N:
LongInt);

var lSrch : LongInt;
var lGarm : LongInt;
var dSum : single;
begin

for lSrch := 0 to N-1 do begin
dSum := 0;
for lGarm := 0 to N div 2 -1
do dSum := dSum + aSpR[lGarm] * cos(lSrch * lGarm * 2 * Pi / N)
+ aSpI[lGarm] * sin(lSrch * lGarm * 2 * Pi / N);

aSignal[lSrch] := dSum/n;
end;
end;


end.


 
Sergo ©   (2002-04-24 16:36) [23]

>VictorT ©
Да ты прав, по теореме частота дискретизации должна вдвое превышать частоту входного сигнала. Но можно ли выставить такую частоту?


 
Sergo ©   (2002-04-24 16:57) [24]

Ну че мне делать то :((


 
VictorT ©   (2002-04-24 17:04) [25]


> Но можно ли выставить такую частоту?

Я думаю, что просто програмно делать задержку и в нужный момент опрашивать звуковуху.


 
Sergo ©   (2002-04-24 17:06) [26]

VictorT ©
Счас попробовал, у меня сразу буфер переполняется и прога виснет, а и вообще мне это ничего не дает.


 
AFROLOV ©   (2002-04-24 17:17) [27]

Не совсем так. Согласно теореме Котельникова частота должна быть не менеечем в 2 раза больше - т.е. не менее 120 Гц. Если у тебя была больше - отлично. Просто ты сразу о параметрах сигнала ничего не сказал.


 
Sergo ©   (2002-04-24 17:20) [28]

Как же высчитать частоту?


 
AFROLOV ©   (2002-04-24 17:35) [29]

Взять любую больше 120 Гц и при которой твоя прога успевает данные обрабатывать.


 
VictorT ©   (2002-04-24 18:20) [30]

Наверное скоро ухожу, так что приведу код, а вы уж без меня решите, подходит он или нет. Я там пообзывал некоторые функции, думаю догадаешься, что имелось в виду.

int value;
int value1 = 0;
int T = GetTime();
while(условие продолжения цикла) {
value = GetSignal();
if (value1 > value) {
Label1->Caption = FloatToStr(GetTime() - T);
T = GetTime();
}
value1 = value;
Wait();
}



 
Sergo ©   (2002-04-25 07:54) [31]

>AFROLOV ©
Я поставил частоту дискретизации 22,5. А как узнать частоту входного сигнала?


 
Sergo ©   (2002-04-25 09:58) [32]

HELP!!!


 
Digitman ©   (2002-04-25 10:10) [33]

22.5кГц - это оч.много для 50Гц.
11кГц - еще куда не шло. Но, насколько мне известно, SB-совместимые карты позволяют выставлять и иные ЧД. Если драйвер карты это позволяет, задай ЧД в диапазоне от 1кгц до 4кГц.

Вот смотри, какой д.б. ход рассуждений и расчетов в данной задаче.
Предположим, ЧД = 1кГц., а ширина фрейма (ШФ, по сути - периодичность измерения вх.сигнала) = 1 сек. При 8-битном монорежиме оцифровки запись длительностью в ШФ секунд потребует 1кб буферной памяти. При этом в буфер будет записана инф-ция о ~ 50-ти периодах вх.сигнала. Это означает, что в полученном при прямом БПФ спектре сигнал частотой в ~ 50 раз превышающей частоту 1Гц (~ 1 / ШФ) , будет представлен ~ 50-й его гармоникой. Амплитуда 50-й гармоники (при том, что вх.сигнал, как ты говоришь, близок к синусоидальному) будет резко отличаться (в общем случае - иметь максимальное значение) от амплитуд прочих гармоник.

Исходя из этого, можно выбрать след.параметры вызова ClassicDirect() :
- aSignal - адрес собственно буфера фрейма;
- размер буфера фрейма N = 1024 (степень двойки !!! на этом базируется вся механика БПФ);
- M = 53 (50 + 3) (выбираемый размер массивов aSpR, aSpI; фактически M - это верхний частотный предел спектра, выше которого частотный анализ нас не интересует в дан.случае)

Результатом работы БПФ будут два заполненных массива aSpR и aSpI, содержащих соотв-но действительные и мнимые составляющие комплексных значений амплитуд упорядоченных (по возрастанию их номеров) гармоник в спектре фрейма вх.сигнала.
Абс. значение ампл-ды k-й гармоники может быть расчитано как aSp[k] = Sqrt(aSpR[k] ^ 2 + aSpI[k] ^ 2). При предполагаемой центральной частоте вх.сигнала ~ 50Гц, можно, проанализировав тем или иным образом некий результ.массив aSp[1..M] (в котором записаны расчитанные по этой формуле абс.зн-я амплитуд гармоник), убедиться, что индекс k максимального элемента массива aSp будет равен 50, что при заданной нами ШФ ~ 1сек. и дает как раз частоту осн.тона сигнала Fвх равной ~50 Гц.

Умешьшив ШФ, к примеру, в 2 раза (ШФ ~ 0.5 сек) для уменьшения периода измерения и, соотв-но, размеров буфера фрейма и массивов aSp, aSpR, aSpI для той же Fвх ~ 50 Гц мы получим иное значение k ~ 50 / 2 ~ 25, но при этом точность измерения, разумеется, понижается из-за особенностей БПФ, связанных с возможностью разложения сигнала в спектр, состоящий только из гармоник с целочисленными номерами.


 
Sergo ©   (2002-04-25 11:20) [34]

У меня родилась идея и я хотел бы посоветоваться:
Я набираю в массив за период времени в 1 сек. значения синусоиды, ищу средених максимальное (амплитудное). Далее считаю количество амплитудных значений за этот период времени - это и будет частота. Конечно от realtime я буду немного отставать.


 
Digitman ©   (2002-04-25 11:51) [35]

>Sergo
Слишком велика будет погрешность и частота сильно "скакать" будет от измерения к измерению. Если вообще получишь правильный результат - гармоники-то возможны, сам же говоришь. Чтобы сие "прокатило", нужно будет содержимое буфера фрейм "прогонять" через ФНЧ перед этим подсчетом, дабы свести до допустимого минимума влияние тех самых гармоник на безошибочность и "плавность" результата. А ФНЧ еще и дополнительную задержку внесет. Плюс - неоптимальность/неэффективность самого алгоритма подсчета (как, впрочем, и в случае с БПФ по приведенному тобой алгоритму в ClassicDirect) : ни MMX ни XMM не используются, а могли бы дать не менее чем 4-хкратное увеличение производительности сквозного тракта программного анализа сигнала.
Поэтому - так или иначе - по-любому рекомендую воспользоваться для своей задачи готовыми реализациями тех или иных выбранных тобой алгоритмов в библиотеке Intel Signal Processing Library v4.x (IntelSPL). Если, конечно, планируешь работу задачи на CPU от Intel. Мощь MMX- и XMM-технологий там задействована "на полную катушку". Есть там все : и векторно/матричные вычисления, и фильтры, и FFT - все, что душе угодно).. Есть в пакете с iSPL и оч.неплохой Делфи5-демо-проект (редкость вообще !), демонстрирующий визуально практически всю функц-ть библиотеки.


 
Sergo ©   (2002-04-25 12:03) [36]

>Digitman ©
Пожалуйта подскажи не битую ссылку на IntelSPL, я много слышал о ней но никак не могу закачать ее.


 
Digitman ©   (2002-04-25 12:18) [37]

http://downloadfinder.intel.com/scripts-df/Product_Filter.asp?ProductID=238

работает, проверено только что.


 
Sergo ©   (2002-04-25 13:10) [38]

>Digitman ©
спасибо


 
Sergo ©   (2002-04-25 15:32) [39]

>Digitman ©
У меня дельфовая демка ругается на nsp.dll не знаешь в чем может быть дело, система ХР?


 
Digitman ©   (2002-04-25 16:20) [40]

>Sergo

И как ругается ?



Страницы: 1 2 вся ветка

Текущий архив: 2002.06.03;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.02 c
7-7241
AlexBeliy
2002-03-09 22:34
2002.06.03
NIST Atomic Clock servers


7-7243
VARVAR
2002-03-08 10:41
2002.06.03
Как составить список переменных в ветке реестра даже если они имеют значение


1-7011
Kordel
2002-05-22 12:32
2002.06.03
Завершение программы


6-7151
серёга
2002-03-25 12:29
2002.06.03
Привет всем. Люди добрые подскажите как наити IP-адрес


3-6937
icu
2002-05-13 19:33
2002.06.03
Развертывание приложений MS SQL Server