12 KiB
source_files, generated_at, model, schema_version, sha256
| source_files | generated_at | model | schema_version | sha256 | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
2026-04-16T03:17:48.073484+00:00 | Qwen/Qwen3-Coder-Next-FP8 | 1 | 5b580a9c32ce9826 |
DSP Module Documentation
1. Purpose
This module provides data structures and utilities for configuring and managing digital signal processing (DSP) filters in the DTS system. It defines filter profiles (StreamingFilterProfile, DSPFilterType), their restrictions based on hardware type and protocol version (DASRestriction, DSPFilterRestriction), and collections (StreamingFilterProfileCollection, DSPFilterCollection) that load filter configurations from XML files. It also includes type converters (StreamingFilterConverter, DSPFilterConverter) for UI integration (e.g., property grids) and supports both legacy and ratio-based filter rate calculations. The module centralizes DSP filter metadata and logic, enabling consistent filter selection and configuration across the application.
2. Public Interface
Classes
-
ScalerAttribute[AttributeUsage(AttributeTargets.Enum | AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Field, AllowMultiple = false)] public class ScalerAttribute : AttributeScaler(double): Stores a scaling factor (e.g., for computing filter cutoff frequencies from sample rates).- Constructor
ScalerAttribute(double d): Initializes theScalerproperty with the provided value.
-
DASRestrictionpublic class DASRestrictionDASType(string): Hardware type string (e.g.,"SLICE6_AIR"). An empty string means all DAS types match.ProtocolVersion(int): Minimum required protocol version. Values ≤ 0 mean all protocol versions match.- Constructors:
DASRestriction(): SetsDASType = "",ProtocolVersion = -1.DASRestriction(string dasType, int protocolVersion): Initializes with specified values.
-
DSPFilterRestrictionpublic class DSPFilterRestrictionIdentical structure and behavior to
DASRestriction(same properties and constructors). Note: No functional difference is evident in the source; likely a duplicate or legacy artifact. -
StreamingFilterProfilepublic class StreamingFilterProfile : IStreamingFilterProfileRatio(double): Scaling factor for computing filter cutoff frequency from sample rate (fc = sps / Ratio).double.NaNindicates no ratio-based calculation.DisplayString(string),DescriptionString(string),EnumValue(int): Metadata for UI and firmware communication.Restrictions(DASRestriction[]): Array of hardware/protocol restrictions.- Constructors:
StreamingFilterProfile(): Default.StreamingFilterProfile(StreamingFilterProfileCollection.DefaultProfiles profile, DASRestriction[] restrictions): Initializes from aDefaultProfilesenum value and restrictions.StreamingFilterProfile(string display, string description, int enumValue, double ratio, DASRestriction[] restrictions): Direct initialization.
GetDSPFilterRate(double sps, string hwType)(double): Returns the filter cutoff frequency (fc) for given sample rate (sps) and hardware type (hwType). Returnsdouble.NaNif filtering is unsupported or restrictions not met.- For
SLICE6_AIRwithsps ≥ 20480, returnsdouble.NaN. - For other cases, uses
DSPFilterType.Get6PButterWorthLegacyTable()andRatioto computefc = sps / RatioifRatiois valid.
- For
ToString(): ReturnsDisplayString.
-
DSPFilterTypepublic class DSPFilterType : IStreamingFilterProfileRatio,EnumValue,DisplayString,DescriptionString,Restrictions: Same semantics asStreamingFilterProfile.- Constructors:
DSPFilterType(): Default.DSPFilterType(DSPFilterCollection.DSPFilterDefaults filter, DASRestriction[] restrictions): Initializes fromDSPFilterDefaultsenum value.DSPFilterType(int enumValue, string displayString, string descriptionString, double ratio, DASRestriction[] restrictions): Direct initialization.
GetDSPFilterRate(double sps, string hwType)(double): Returnsfcfor the legacy 6-pole Butterworth filter (EnumValue == 13). Returnsdouble.NaNifEnumValue ≠ 13, restrictions not met, or hardware unsupported.- Static Methods:
Get6PButterWorthLegacyTable()(Tuple<int, int>[]): Returns the breakpoint table:[(8000,1280), (5000,610), (2000,366), (1000,120), (500,120), (200,50), (80,15)].GetLegacytDSPFilterRate(double sps, string hwType)(double): Returnsfcfor legacy Butterworth filter using the breakpoint table. Returnsdouble.NaNforSLICE6_AIRwithsps ≥ 20480.
- Constants:
S6A_CAP(int = 20480): Sample rate threshold above whichSLICE6_AIRfalls back to analog filtering.
-
StreamingFilterProfileCollectionpublic class StreamingFilterProfileCollection : Collection<StreamingFilterProfile>GetCollection()(static): Singleton accessor. Loads from"StreamingFilterProfiles.xml"(creates default file if missing).GetStreamingFilterProfile(string s)(StreamingFilterProfile): Returns the profile with matchingDisplayString, or the default (EnumValue == 13), or the first item.DefaultProfilesenum: Defines profiles withScalerAttributeforRatio:Default(13):Ratio = NaN(legacy).Profile7(7):Ratio = 4.Profile8(8):Ratio = 6.4.Profile9(9):Ratio = 8.Profile10(10):Ratio = 10.
DEFAULT_VALUE(int = 13): Enum value for the default profile.
-
DSPFilterCollectionpublic class DSPFilterCollection : Collection<DSPFilterType>GetDSPFilterCollection()(static): Singleton accessor. Loads from"DSPFilters.xml"(creates default file if missing).GetFilter(string s)(DSPFilterType): Returns filter with matchingDisplayString, orEnumValue == 0(None), or first item.DSPFilterDefaultsenum: Defines filter types withScalerAttribute(Ratio = NaNfor all):None(0).Butterworth(13).FIR(14).
- Constants:
BUTTERWORTH(int = 13),FIR45TAP(int = 14),NONE(int = 0).
Converters
-
StreamingFilterConverterpublic class StreamingFilterConverter : ArrayConverterValues(StreamingFilterProfile[]): Cached array of profiles fromStreamingFilterProfileCollection.CanConvertFrom,ConvertFrom: Supports conversion fromstring(matchesDisplayString).GetStandardValuesSupported,GetStandardValuesExclusive,GetStandardValues: Provides standard values (entire collection) for property grids.
-
DSPFilterConverterpublic class DSPFilterConverter : ArrayConverterValues(DSPFilterType[]): Cached array of filters fromDSPFilterCollection.CanConvertFrom,ConvertFrom: Supports conversion fromstring(matchesDisplayString).GetStandardValuesSupported,GetStandardValuesExclusive,GetStandardValues: Provides standard values (entire collection) for property grids.
Interfaces
IStreamingFilterProfileDefines contract for filter profiles:public interface IStreamingFilterProfileEnumValue(int),DisplayString(string),DescriptionString(string),Restrictions(DASRestriction[]),Ratio(double).GetDSPFilterRate(double sps, string hwType)(double): Compute filter cutoff frequency.
3. Invariants
- Singleton Collections:
StreamingFilterProfileCollection.GetCollection()andDSPFilterCollection.GetDSPFilterCollection()are thread-safe singletons (usinglockand lazy initialization). The XML files (StreamingFilterProfiles.xml,DSPFilters.xml) are created with defaults if missing. - Restriction Matching: A restriction matches if
DASTypeis empty (any hardware) or equalshwType, andProtocolVersion ≤ 0(any version) orProtocolVersionmatches the DAS’s version (exact match implied, though version comparison logic is not in this module). - Filter Rate Calculation:
StreamingFilterProfile.GetDSPFilterRateusesRatiofor ratio-based filters (Ratio > 0) and falls back to legacy table lookup (DSPFilterType.GetLegacytDSPFilterRate) only ifEnumValue == DEFAULT_VALUE(13) andRatio = NaN.DSPFilterType.GetDSPFilterRateonly supports the Butterworth filter (EnumValue == 13).SLICE6_AIRwithsps ≥ 20480is unsupported for digital filtering (returnsdouble.NaN).
- Enum Values:
DEFAULT_VALUE = 13(forStreamingFilterProfileCollection.DefaultProfiles.Default) andBUTTERWORTH = 13(forDSPFilterCollection.DSPFilterDefaults.Butterworth) are hardcoded constants.
4. Dependencies
Internal Dependencies
DTS.Common.Enums.Hardware: Used forHardwareTypes(e.g.,SLICE6_AIR,SLICE6_AIR_BR,SLICE6_AIR_TC).System.ComponentModel.DataAnnotations: Used forDisplayAttribute(to extractName/Descriptionfrom enum fields).System.Xml.Serialization: Used for XML serialization/deserialization of collections.System.Collections.ObjectModel: Base forCollection<T>.
External Dependencies
- XML Files:
StreamingFilterProfiles.xml: Default location for streaming filter profiles.DSPFilters.xml: Default location for DSP filter types.
(Both are created on first access if missing.)
- UI Frameworks:
StreamingFilterConverterandDSPFilterConverterdepend onSystem.ComponentModel(e.g.,ITypeDescriptorContext,StandardValuesCollection) for property grid integration.
Inferred Usage
StreamingFilterProfileCollectionandDSPFilterCollectionare used by converters and likely by UI components (e.g., dropdowns for filter selection).ScalerAttributeis applied to enums inStreamingFilterProfileCollection.DefaultProfilesandDSPFilterCollection.DSPFilterDefaultsto store scaling factors.
5. Gotchas
- Duplicate Classes:
DASRestrictionandDSPFilterRestrictionare identical in structure and behavior. The codebase does not clarify if they serve distinct purposes or are redundant. Ratio = NaNSemantics: InStreamingFilterProfile,Ratio = NaNtriggers legacy filter rate calculation (viaDSPFilterType.GetLegacytDSPFilterRate), but only ifEnumValue == DEFAULT_VALUE(13). This is not obvious from the method name or documentation.GetDSPFilterRateInconsistency:StreamingFilterProfile.GetDSPFilterRateusesRatiofor ratio-based filters.DSPFilterType.GetDSPFilterRateonly supports Butterworth (EnumValue == 13) and ignoresRatio.
This impliesStreamingFilterProfileis for flexible profiles, whileDSPFilterTypeis for legacy filter types.
- Hardware-Specific Logic:
SLICE6_AIRhas a special case (sps ≥ 20480→double.NaN) in bothStreamingFilterProfileandDSPFilterType. This is hardcoded and not configurable via XML. - Protocol Version Matching:
ProtocolVersionis stored but never compared against a DAS’s actual version in the provided code. Matching logic is assumed but not implemented here. - Case Sensitivity:
GetFilter/GetStreamingFilterProfileuseDisplayString == s(case-sensitive). UI components may need to handle case normalization. - Thread Safety: Singletons use
lockfor initialization, but cached arrays (Valuesin converters) are not reloaded if XML files change at runtime. - Typo: Method
GetLegacytDSPFilterRate(missing 'h' in "Legacy") andS6A_CAP(capitalization inconsistency withSLICE6_AIRenum values).